【发布时间】:2018-08-01 16:54:45
【问题描述】:
我想让两个 Raspberry Pi 使用 ZigBee 协议互相发送消息。 我已经使用 USB Explorer (CH430g) 将 XBee S2C (ZigBee) 模块连接到 Raspberry Pi。 我已经编写了一个 python 脚本来完成所需的工作,
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
while True:
incoming = ser.readline().strip()
print ('%s' %incoming.decode())
string = input("") + '\n'
ser.write(string.encode())
但是我需要一个 C 程序来做同样的事情, 我查看了用于 C 和 C++ 的 libserial 库,发现它有问题并且从未为我编译过。
我试过this thread 它工作得很好,但是在接收方我需要保持read(fd, &buffer, sizeof(buffer)); 在while 循环中以持续打开以进行侦听,这与C 套接字程序不同,其中read() 函数将停止直到它接收数据就像我的 python 脚本将在行中等待incoming = ser.readline().strip() 直到它收到一些消息。
不使用while循环有什么解决办法吗?
编辑 1:
在上述python代码中,while循环用于接收多条消息。 incoming = ser.readline().strip() 行将捕获消息,对其进行处理并等待下一条消息,因为它在 while 循环中。
如果我的代码是这样的,在 C 中:
while(1){
str = read();
//some processing
}
它会抛出错误,因为read 在获取数据之前不会停止,它只是返回读取失败。由于读取的数据是NULL,数据的后处理会抛出错误。
为了让它发挥作用,我引入了另一个 while 循环,如下所示:
while(1){
while(1){
str = read();
if(str!=NULL)
break;
}
//some processing
}
我想消除这个额外的循环并让read() 等待消息。
PS:我打开串口设备是这样的:uart0_filestream = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
【问题讨论】:
-
如果您专门针对 C 提出这个问题,为什么是 C++?
-
上述线程中的
read()是阻塞,会使进程进入睡眠状态等待数据,所以是的,你可以在循环中使用它(小心&buffer,是bug,也看答案)。我可以问一下为什么如果 python 脚本正在运行,你需要在 C 中使用它吗? -
@hellow 我更喜欢 C,但 C++ 中提供了解决方案,我对此很好。
-
@Alex 其实我不想在 while 循环中使用
read(),因为代码只是其他大型项目的一部分。所以我在问如何避免 while 循环或任何可用于 C/C++ 的库。正如我所说,它是项目的一部分,应该是 C/C++ 我不能在其中使用 python 脚本。 -
@VinayakaSP 我现在看到了,对不起,你可以将串口配置为非阻塞,你可以在等待数据的同时使用
select()做一些其他的事情,但是如果您期望更多数据,我看不出如何摆脱循环
标签: c raspberry-pi serial-communication