Embed presentation
Download to read offline













![LF0x311[送信] 受信バッファFIFO(First In First Out)先入れ先出し↑“1”、改行文字の2バイトが受信バッファにたまる順序が維持1バイトずつ読み込み表示改行“1”1番目63番目0番目受信バッファとFIFO「1」を送信すると下記が送信・文字1・改行文字LF](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-14-2048.jpg&f=jpg&w=240)
![受信バッファとFIFO• 「12」を送信するとLF0x320x31 0番目1番目63番目12[送信] 受信バッファFIFO(First In First Out)先入れ先出し↑“1”、”2”、改行文字の3バイトが受信バッファにたまる1バイトずつ読み込み表示改行”2”“1”](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-15-2048.jpg&f=jpg&w=240)
![LF0x320x31 0番目1番目63番目12[送信] 受信バッファFIFO(First In First Out)先入れ先出し↑“1”、”2”、改行文字の3バイトが受信バッファにたまる順序が維持1バイトずつ読み込み表示改行”2”“1”](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-16-2048.jpg&f=jpg&w=240)



![効率よく送る(データ構造)• 例:「15」を送る。受信側は数字として扱う。• 文字で送る(シリアルモニタはこちら)• 文字を送ることになる「1」と「5」の2バイト• [0x31][0x35]を送る=1バイトを2回送信• 文字⇒数字の変換を行う。• 数字(バイト)で送る(ソフトを作る場合はこちら)• 「15」(数字)をバイト変換。1バイト• [0x0F]を送る=1バイトを1回送信• 数字をそのまま使用可能• 1回に複数送る• 数字0~15に限定可能ならば、1回でまとめておる事が可能• 1回目を上位4ビット、2回目を4ビットに割り当てて送信=1バイトを1回送信で2回分送れる0 0 0 0 0 0 0 01byte = 8 bit0 0 0 1 1 1 1 10 0 1 0 0 0 1 10x010x050 0 0 0 1 1 1 10x151 1 1 1 0 0 0 10x79↑1bit目↑8bit目1回目と2回目を1バイトに格納](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-20-2048.jpg&f=jpg&w=240)



![0x320x31 0番目1番目63番目12[送信] 受信バッファFIFO(First In First Out)先入れ先出し2バイト読み込んだら下記の処理0x31を代入0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 1 1 0 0 0 10 0 0 0 0 0 0 08bit左シフト0x32を代入0 0 1 1 0 0 0 10 0 1 1 0 0 0 1 0 0 1 1 0 0 1 02バイト分確保//上位下位をどうするか?unsigned int value = 0;//int型にデータを当てはめるvalue += byte1;value = value << 8;value += byte2;0x3132、12594(10進数)](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-24-2048.jpg&f=jpg&w=240)












![#define RCV_SIZE 10#define RCV_LOOP 10byte rcvData[RCV_SIZE];//--------------------------------------------------------------------//loop()//--------------------------------------------------------------------void loop() {//シリアル通信で1パケット受信//データがあった=欲しいデータが送信中/されたとするif (Serial.available() > 0){//受信データ変数クリアmemset(rcvData, 0, RCV_SIZE);//RCV_LOOP分がデータ受信待ちなどの待機≒タイムアウトunsigned int chkSumRcv = 0;int readCount = 0;for (int i = 0; i < RCV_LOOP; i++){//wait 9600 bit/s=1200 byte/s->10 byteは8.3ms相当で貯まるはずdelay(5);//readunsigned int canReadSize = Serial.available();if (canReadSize <= 0){continue;}else if (canReadSize > 0){//バッファにあるデータを1バイトずつ読み込むfor (int i = 0; i < canReadSize; i++){byte temp = Serial.read();rcvData[readCount] = temp;//先頭2バイトはチェックサム計算しないif (readCount >= 2){chkSumRcv += temp;}readCount++;}//指定サイズを読み込んだ時ループを脱するif (readCount == RCV_SIZE){break;}}}//受信データのチェックサム確認unsigned int chkSumFromRcvData = (rcvData[0]<<8) | rcvData[1];if ( chkSumRcv == chkSumFromRcvData){Serial.println("OK");}else{Serial.println("Fail");}}delay(1);}](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-37-2048.jpg&f=jpg&w=240)









移行 https://speakerdeck.com/tomit3/ltikadezhong-warasenaiarduino-siriarutong-xin-part2前回(https://www.slideshare.net/tomit3/larduino-part1)の資料の続き。ArduinoとPCの間で通信を行う方法についてまとめた資料です。LチカからPCとArduinoで通信を行う簡単な方法を説明しています。













![LF0x311[送信] 受信バッファFIFO(First In First Out)先入れ先出し↑“1”、改行文字の2バイトが受信バッファにたまる順序が維持1バイトずつ読み込み表示改行“1”1番目63番目0番目受信バッファとFIFO「1」を送信すると下記が送信・文字1・改行文字LF](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-14-2048.jpg&f=jpg&w=240)
![受信バッファとFIFO• 「12」を送信するとLF0x320x31 0番目1番目63番目12[送信] 受信バッファFIFO(First In First Out)先入れ先出し↑“1”、”2”、改行文字の3バイトが受信バッファにたまる1バイトずつ読み込み表示改行”2”“1”](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-15-2048.jpg&f=jpg&w=240)
![LF0x320x31 0番目1番目63番目12[送信] 受信バッファFIFO(First In First Out)先入れ先出し↑“1”、”2”、改行文字の3バイトが受信バッファにたまる順序が維持1バイトずつ読み込み表示改行”2”“1”](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-16-2048.jpg&f=jpg&w=240)



![効率よく送る(データ構造)• 例:「15」を送る。受信側は数字として扱う。• 文字で送る(シリアルモニタはこちら)• 文字を送ることになる「1」と「5」の2バイト• [0x31][0x35]を送る=1バイトを2回送信• 文字⇒数字の変換を行う。• 数字(バイト)で送る(ソフトを作る場合はこちら)• 「15」(数字)をバイト変換。1バイト• [0x0F]を送る=1バイトを1回送信• 数字をそのまま使用可能• 1回に複数送る• 数字0~15に限定可能ならば、1回でまとめておる事が可能• 1回目を上位4ビット、2回目を4ビットに割り当てて送信=1バイトを1回送信で2回分送れる0 0 0 0 0 0 0 01byte = 8 bit0 0 0 1 1 1 1 10 0 1 0 0 0 1 10x010x050 0 0 0 1 1 1 10x151 1 1 1 0 0 0 10x79↑1bit目↑8bit目1回目と2回目を1バイトに格納](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-20-2048.jpg&f=jpg&w=240)



![0x320x31 0番目1番目63番目12[送信] 受信バッファFIFO(First In First Out)先入れ先出し2バイト読み込んだら下記の処理0x31を代入0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 1 1 0 0 0 10 0 0 0 0 0 0 08bit左シフト0x32を代入0 0 1 1 0 0 0 10 0 1 1 0 0 0 1 0 0 1 1 0 0 1 02バイト分確保//上位下位をどうするか?unsigned int value = 0;//int型にデータを当てはめるvalue += byte1;value = value << 8;value += byte2;0x3132、12594(10進数)](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-24-2048.jpg&f=jpg&w=240)












![#define RCV_SIZE 10#define RCV_LOOP 10byte rcvData[RCV_SIZE];//--------------------------------------------------------------------//loop()//--------------------------------------------------------------------void loop() {//シリアル通信で1パケット受信//データがあった=欲しいデータが送信中/されたとするif (Serial.available() > 0){//受信データ変数クリアmemset(rcvData, 0, RCV_SIZE);//RCV_LOOP分がデータ受信待ちなどの待機≒タイムアウトunsigned int chkSumRcv = 0;int readCount = 0;for (int i = 0; i < RCV_LOOP; i++){//wait 9600 bit/s=1200 byte/s->10 byteは8.3ms相当で貯まるはずdelay(5);//readunsigned int canReadSize = Serial.available();if (canReadSize <= 0){continue;}else if (canReadSize > 0){//バッファにあるデータを1バイトずつ読み込むfor (int i = 0; i < canReadSize; i++){byte temp = Serial.read();rcvData[readCount] = temp;//先頭2バイトはチェックサム計算しないif (readCount >= 2){chkSumRcv += temp;}readCount++;}//指定サイズを読み込んだ時ループを脱するif (readCount == RCV_SIZE){break;}}}//受信データのチェックサム確認unsigned int chkSumFromRcvData = (rcvData[0]<<8) | rcvData[1];if ( chkSumRcv == chkSumFromRcvData){Serial.println("OK");}else{Serial.println("Fail");}}delay(1);}](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2f20210921larduinopublic-230506085104-2d71ecb9%2f75%2fL-Arduino-Part2-37-2048.jpg&f=jpg&w=240)







