問題になっていること
今python(pc)->arduinoで画像(128*64,白黒1bit/pixel)の通信機能を実装しています。
下のコードは、全てのドットを白で埋めた画像を送信したところ、不具合なく動作しました。
しかし、ほかの画像でバイト配列の中に0x0が入るとarduino側で受信できないのか処理してくれません。
0x0を受信できないことについて調べても情報がなかったので、詳しい方、どなたか原因を教えてください。
##ソースコード
念のため全文載せます。変数スペルミスたぶんあるけど無視してください。
python
1import serial 2import time 3from PIL import Image,ImageDraw,ImageFont 4import numpy as np 5 6im=Image.new("1",(128,64)) 7im_d=ImageDraw.Draw(im) 8im_d.font=ImageFont.truetype(r"O:\PixelMplus12-Regular.ttf",40) 9im_d.text((0,-5),r"テスト test",1) 10#im_d.polygon((0,0,0,64,128,64,128,0),"WHITE") 白埋め 11#im.show() 12im_ar=np.asarray(im) 13time.sleep(2) 14 15 16with serial.Serial('COM14',baudrate=115200,timeout=None,bytesize=8,parity="N",stopbits=1,dsrdtr=False) as ser: 17 time.sleep(3) 18 def packetsend(stat,data=[0]): 19 ser.write(stat.to_bytes(1,'big')) 20 21 for packet in data: 22 ser.write(packet.to_bytes(1,'big')) 23 24 ser.write(0x29.to_bytes(1,'big')) 25 ser.write(0x40.to_bytes(1,'big')) 26 return ser.readline() 27 28 packetsend(0x14) 29 time.sleep(2) 30 31 for im_snd in im_ar: 32 sendbytes=[] 33 im_index=0 34 im_byte=0 35 for im_bit in im_snd: 36 im_byte=im_byte<<1 37 im_byte=im_byte|im_bit 38 im_index+=1 39 if(im_index>7): 40 sendbytes.append(int(im_byte)) 41 print(bin(im_byte)) 42 im_byte=0 43 im_index=0 44 45 packetsend(0x12,sendbytes) 46 47 time.sleep(2) 48 packetsend(0x13) 49 50 while 1: 51 print(ser.readline()) 52 ser.close() 53
arduino
1#include <Arduino.h> 2#include <Adafruit_GFX.h> 3#include <Adafruit_SSD1306.h> 4uint8_t incomingByte = 0; // 受信するシリアルデータのために準備 5bool recieving = false; 6uint8_t stats = 0; 7uint8_t data[32]; 8int dataindex = 0; 9uint8_t recievdata = 0; 10uint8_t recievdata2 = 0; 11 12int d_x = 0; 13bool endready = false; 14int d_y = 0; 15#include <SPI.h> 16#include <Wire.h> 17Adafruit_SSD1306 display(128, 64, &Wire, 4); 18void recvdo(uint8_t cval) 19{ 20 21 switch (stats) 22 { 23 case 0x31: 24 data[dataindex] = cval; 25 break; 26 case 0x10: 27 d_x = cval; 28 break; 29 case 0x11: 30 d_y = cval; 31 break; 32 case 0x12: 33 Serial.print(cval, HEX); 34 for (int b = 7; b >= 0; b--) 35 { 36 if (bitRead(cval, b) == true) 37 { 38 display.drawPixel(d_x, d_y, WHITE); 39 } 40 d_x++; 41 if (d_x > 127) 42 { 43 d_x = 0; 44 d_y++; 45 } 46 } 47 break; 48 case 0x13: 49 display.display(); 50 break; 51 case 0x14: 52 display.clearDisplay(); 53 break; 54 55 //display.invertDisplay(); 56 } 57} 58void setup() 59{ 60 Serial.begin(115200, SERIAL_8N1); 61 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 62 display.display(); 63 delay(1000); 64 display.clearDisplay(); 65} 66 67void loop() 68{ 69 70 // データを受信した場合にのみ,データを送信する 71 while (Serial.available() > 0) 72 { 73 74 // 受信したデータの1バイトを読み取る 75 if (recieving == false) 76 { 77 stats = Serial.read(); 78 recieving = true; 79 memset(data, 0, sizeof(data)); 80 dataindex = 0; 81 } 82 else 83 { 84 85 recievdata = Serial.read(); 86 if (recievdata == 0x29) 87 { 88 endready = true; 89 while (Serial.available() > 0) 90 { 91 recievdata2 = Serial.read(); 92 if (recievdata == 0x29 && recievdata2 == 0x40) 93 { 94 recieving = false; 95 Serial.println("pe"); 96 } 97 else 98 { 99 recvdo(recievdata); 100 recvdo(recievdata2); 101 } 102 } 103 } 104 else if (recievdata != 0x29) 105 { 106 recvdo(recievdata); 107 } 108 } 109 } 110} 111
試したこと
シリアル通信のモード(パリティビットなど)は揃えてみましたが意味はありませんでした
回答3件
あなたの回答
tips
プレビュー