回答編集履歴

1

追記

2021/11/12 12:54

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -23,3 +23,25 @@
23
23
  しかし、一番普通に行われることは、バイナリではなく「数字」に変換して(複数バイトで)通信することです。0x15の1バイトを送るのではなく、'2''1'という数字を送ります。当然ながら数字でない文字は「付加情報」であることが明らかになるので、この前に例えば'X', 後ろに','をつければ"X21,"を受信したらX,"Y123,"を受信したらYの値とすればいいという話になります。
24
24
 
25
25
  通信量は増えますが、いろいろな意味で「扱いやすい」データになります。
26
+
27
+
28
+
29
+ ---
30
+
31
+ ちょっと思い出したので追記。
32
+
33
+
34
+
35
+ シリアル通信の通信の単位は1バイトで、それ以上でも以下でもありません。
36
+
37
+
38
+
39
+ pythonでSerial.write(文字列)という関数がありますが、決して「文字列」がなにか一つの単位として送られるわけではなく、単に文字列を一文字ずつ送っているだけだ、ということに注意してください。
40
+
41
+ 言い換えれば、受信する側がその文字列をまとめて受信する保証はまったくないということです。
42
+
43
+ もちろん、一つの関数で順次送るのであれば時間的には密着するので、この回答の最初で言ったような「時間的な配置」として塊で受信できてしまう可能性は大きくなります。しかし、それは(ちゃんとその時間関係を設計するのでないかぎり)保証されたものではない、ということに留意。
44
+
45
+
46
+
47
+ もう少し具体的にいうと、送る側で"X21,Y123,"を送ったから受信で9文字受信の指示をしたら"X21,Y123,"が受信できる、と期待してはいけません。X21,y12で一旦切れてしまうかも知れない、あるいは前回切れた切れ端が頭にくっついて3,X21,Y12の9文字が受信できてしまうかもしれない、そういうのにちゃんと対応出来て初めてまともなUART通信のプログラムと言えます。