ฉันกำลังเขียนโปรแกรมที่อ่านข้อมูลจากพอร์ตอนุกรมบน Linux ข้อมูลถูกส่งโดยอุปกรณ์อื่นด้วยรูปแบบเฟรมต่อไปนี้:


|start | Command | Data               | CRC  | End |
|0x02  | 0x41    | (0-127 octets)     |      | 0x03|
----------------------------------------------------

ฟิลด์ Data มี 127 octets ตามที่แสดง และ octet 1,2 มีข้อมูลประเภทหนึ่ง octet 3,4 มีข้อมูลอื่น ฉันต้องการรับข้อมูลเหล่านี้

เนื่องจากในCหนึ่งไบต์สามารถเก็บอักขระได้เพียงตัวเดียวและในช่องเริ่มต้นของเฟรมคือ 0x02 ซึ่งหมายถึง STX ซึ่งมีอักขระ 3 ตัว

ดังนั้น เพื่อทดสอบโปรแกรมของฉัน

ในด้านผู้ส่ง ฉันสร้างอาร์เรย์ตามรูปแบบเฟรมด้านบนดังนี้:


char frame[254];
frame[0] = 0x02; // starting field
frame[1] = 0x41; // command field which is character 'A'
..so on..

และจากนั้น ทางด้านผู้รับ ฉันนำฟิลด์ออกไปเช่น:

char result[254];
// read data
read(result);
printf("command = %c", result[1]); // get the command field of the frame

// get other field's values

ค่าฟิลด์คำสั่ง (ผลลัพธ์ [1]) ไม่ใช่อักขระ 'A'

ฉันคิดว่านี่เป็นเพราะค่าฟิลด์แรกของเฟรมคือ 0x02 (STX) ที่ครอบครอง 3 ตำแหน่งแรกในเฟรมอาร์เรย์และนำไปสู่ผลลัพธ์ที่ไม่ถูกต้องในด้านผู้รับ

ฉันจะแก้ไขปัญหาหรือทำอะไรผิดที่ฝั่งผู้ส่งได้อย่างไร

คำถามที่เกี่ยวข้อง:
แยกวิเคราะห์และอ่าน data frame ใน C?
ล้างข้อมูลที่พอร์ตอนุกรมใน Linux ใน C?

ตอบ

หากโปรแกรมของคุณมี

read(result);

จากนั้นคุณต้องเพิ่ม

#include <unistd.h>

ที่ด้านบน เพื่อรับฟังก์ชันต้นแบบสำหรับread. จากนั้นคุณต้องไปopenที่พอร์ตอนุกรมและส่งตัวอธิบายไฟล์ที่เป็นผลลัพธ์ไปreadพร้อมกับบัฟเฟอร์ของคุณเพื่อให้รู้ว่าต้องอ่านอะไร ดูman 2 readและman 2 open.