ipk*_*iss 3 c linux serial-port frame
我正在编写一个程序,从Linux上的串口读取数据.数据由具有以下帧格式的其他设备发送:
|start | Command | Data | CRC | End |
|0x02 | 0x41 | (0-127 octets) | | 0x03|
----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
数据字段包含127个八位字节,如图所示,八位字节1,2包含一种类型的数据; 八位位组3,4包含另一个数据.我需要获取这些数据
我知道如何在Linux中写入和读取串行端口的数据,但它只是编写和读取一个简单的字符串(如"ABD")
我的问题是我不知道如何解析上面格式化的数据框,以便我可以:
这里是一个示例剪辑代码,它在Linux中从一个串口读取和写入一个简单的字符串:
int writeport(int fd, char *chars) {
int len = strlen(chars);
chars[len] = 0x0d; // stick a <CR> after the command
chars[len+1] = 0x00; // terminate the string properly
int n = write(fd, chars, strlen(chars));
if (n < 0) {
fputs("write failed!\n", stderr);
return 0;
}
return 1;
}
int readport(int fd, char *result) {
int iIn = read(fd, result, 254);
result[iIn-1] = 0x00;
if (iIn < 0) {
if (errno == EAGAIN) {
printf("SERIAL EAGAIN ERROR\n");
return 0;
} else {
printf("SERIAL read error %d %s\n", errno, strerror(errno));
return 0;
}
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
有没有人请一些想法?
result是一个chars 数组,宽度为1个八位字节.
阅读octet n使用:
char octet_n = result[n];
Run Code Online (Sandbox Code Playgroud)
所以做你想要的你需要的东西:
// skip the start and command fields
char *data_field = result + 2;
int octet_1_2 = data_field[1] | (data_field[2] << 8);
int octet_3_4 = data_field[3] | (data_field[4] << 8);
// crc is at byte 128 + 2 = 130
int crc = result[130];
Run Code Online (Sandbox Code Playgroud)
编辑:此行的解释:
int octet_1_2 = data_field[1] | (data_field[2] << 8);
Run Code Online (Sandbox Code Playgroud)
您希望将两个连续的八位字节读取为一个16位字:
1
bits 5 8 7 0
--------------------
octet_1_2 = | octet 2 | octet 1|
--------------------
Run Code Online (Sandbox Code Playgroud)
所以你想把8位的比特7:0放在7:0的位octet_1_2:
octet_1_2 = data_field[1];
Run Code Online (Sandbox Code Playgroud)
然后你想取八位字节2的7:0位并将它们放在15:8的位中octet_1_2.你可以通过向左移八位字节8位,并将OR结果输入octet_1_2:
octet_1_2 |= data_field[2] << 8;
Run Code Online (Sandbox Code Playgroud)
如上所述,这两行可以合并为一行.
| 归档时间: |
|
| 查看次数: |
2873 次 |
| 最近记录: |