我正在尝试从rs232 com端口正确读取,这是从卡车重量等级获取信息。我知道体重秤每秒发出的重量大约是其重量的10倍,并且它不需要任何输入,只是不断发送它。
我已经可以阅读重量,但问题是我无法读取体重秤发送的文本的单行。所以我希望有人可能会对C代码进行整理,以便它读取一行。
顺便说一下,我找到了源代码here,它不是我的。
#include <stdlib.h>
#include <stdio.h>
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
#include "rs232.h"
int main()
{
int i, n,
cport_nr=0, /* /dev/ttyS0 (COM1 on windows) */
bdrate=9600; /* 9600 baud */
unsigned char buf[4096];
char mode[]={'8','N','1',0};
if(RS232_OpenComport(cport_nr, bdrate, mode))
{
printf("Can not open comport\n");
return(0);
}
while(1)
{
n = RS232_PollComport(cport_nr, buf, 4095);
if(n > 0)
{
buf[n] = 0; /* always put a "null" at the end of a string! */
for(i=0; i < n; i++)
{
if(buf[i] < 32) /* replace unreadable control-codes by dots */
{
buf[i] = '.';
}
}
printf("received %i bytes: %s\n", n, (char *)buf);
}
#ifdef _WIN32
Sleep(100);
#else
usleep(100000); /* sleep for 100 milliSeconds */
#endif
}
return(0);
}
所以,我想在这里完成的是这个C程序应该从体重秤读取一行,输出然后退出。这条线应该标记为&#39;使用分隔符,例如EOL
或##
或其他内容。提前致谢
EDIT1: - 每个尺度的样本输出 -
1st:
000000.,001000001,99
000000.,001000001,99
000000.,001000001,99
000000.,001000001,99
000000.,001000001,99
2nd:
+ 0.0
+ 0.0
+ 0.0
+ 0.0
+ 0.0
3rd:
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
EDIT2: 好的,我找到了rs232协议手册。 这是比例协议的对应表
Data | ascii code | Description
SP 20h white space
D6 0-9 1st weight digit
D5 0-9 2nd "
D4 0-9 3rd
PD 2Eh decimal mark
D3 0-9 4th weight digit
D2 0-9 5th "
D1 0-9 6th "
CR 0Dh carriage return
LF 0Ah line feed
答案 0 :(得分:0)
关键问题是数据以异步方式到达代码搜索它时 - 数据到达时 - 代码正在查找与到达没有时间关系的数据。
因此,当代码搜索RS232_PollComport()
:0的消息时,可能会产生部分,完整或完整和部分消息。
取决于效果目标的各种方法:让我们尝试一个简单的方法:寻找' '
并继续打印直到'\n'
。
void Service_Port(int cport_nr) {
char *front_delimiter = "<";
char *end_delimiter = ">";
int start_of_frame = ' ';
int end_of_frame = '\n';
int start_of_frame_found = 0;
for (;;) {
char buf[1];
int n = RS232_PollComport(cport_nr, buf, sizeof buf);
if (n > 0) {
if (buf[0] == start_of_frame) {
fputs(front_delimiter, stdout);
start_of_frame_found = 1;
}
if (start_of_frame_found) {
fputc(buf[0], stdout);
if (buf[0] == end_of_frame) {
fputs(end_delimiter, stdout);
return;
}
}
}
} // end for
}
上面花了很多的时间循环并等待'\n'
。
可能进行各种改进,但这符合OP的目标
从体重秤读取一行,输出然后退出......该行应标记为&#39;与分隔符