- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们整个上午都在为这个问题苦苦思索。我们在嵌入式 linux 设备和 Ubuntu 机器之间设置了一些串行线路。我们的读取被搞砸了,因为我们的代码通常返回两个(有时更多,有时恰好一个)消息读取,而不是每发送一个实际消息读取一个消息。
下面是打开串口的代码。 InterCharTime 设置为 4。
void COMClass::openPort()
{
struct termios tio;
this->fd = -1;
int tmpFD;
tempFD = open( port, O_RDWR | O_NOCTTY);
if (tempFD < 0)
{
cerr<< "the port is not opened"<< port <<"\n";
portOpen = 0;
return;
}
tio.c_cflag = BaudRate | CS8 | CLOCAL | CREAD ;
tio.c_oflag = 0;
tio.c_iflag = IGNPAR;
newtio.c_cc[VTIME] = InterCharTime;
newtio.c_cc[VMIN] = readBufferSize;
newtio.c_lflag = 0;
tcflush(tempFD, TCIFLUSH);
tcsetattr(tempFD,TCSANOW,&tio);
this->fd = tempFD;
portOpen = true;
}
另一端进行类似的通信配置,并有一小部分特定的 iterest:
while (1)
{
sprintf(out, "\r\nHello world %lu", ++ulCount);
puts(out);
WritePort((BYTE *)out, strlen(out)+1);
sleep(2);
} //while
现在,当我在接收机器上运行读取线程时,“hello world”通常被分成几条消息。这是一些示例输出:
1: Hello
2: world 1
3: Hello
4: world 2
5: Hello
6: world 3
其中数字后跟冒号是收到的一条消息。你能看到我们犯了什么错误吗?
谢谢。
编辑:为清楚起见,请查看section 3.2 of the Linux Serial Programming HOWTO .据我了解,如果 VTIME 为几秒(意味着 vtime 设置在 10 到 50 之间的任何位置,反复试验),VMIN 为 1,则消息没有理由被分解为两条单独的消息.
最佳答案
我不明白你为什么感到惊讶。
您要求至少一个字节。如果您的 read() 要求更多,这似乎很可能,因为您很惊讶您没有在一次读取中获得整个字符串,它可以获取任何可用的数据,直到 read() 大小。但并非所有数据都在一次读取中可用,因此您的字符串在读取之间被切碎。
在这种情况下,计时器并不重要。在至少有一个字节可用之前,不会设置定时器。但是您已将最小值设置为 1。因此它只返回可用字节数 (>= 1),最大为 read() 大小字节。
关于Linux termios VTIME 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1133352/
我们整个上午都在为这个问题苦苦思索。我们在嵌入式 linux 设备和 Ubuntu 机器之间设置了一些串行线路。我们的读取被搞砸了,因为我们的代码通常返回两个(有时更多,有时恰好一个)消息读取,而不是
我正在尝试通过串口连接设备。设备每 700 毫秒发送一次 10 字节 轮询作为“心跳”。每次我读取心跳时,我都必须回复一个 12 字节 长的响应。 在此响应中,我可以请求设备在轮询之间发送特定数据。不
我正在尝试为 Linux 编写一个简单的 C 串行通信程序。我对阻塞/非阻塞读取和 VMIN/VTIME 关系感到困惑。 我的问题是,是否应该根据我是否有阻塞/非阻塞打开调用来设置 VMIN/VTIM
我正在改编我为跨平台兼容性而编写的一个简单的 Linux 串行库。大多数事情都会保留下来(尽管 Microsoft 坚持要重命名所有内容),但有一些我没能找到的功能。 我当前的问题是 VMIN 和 V
我是一名优秀的程序员,十分优秀!