我想让两个树莓派用ZigBee协议互相发送消息。我已经使用USB资源管理器(CH430g)将XBee S2C(ZigBee)模块连接到Raspberry Pi。我写了一个python脚本,它可以完成所需的工作,import serialser = 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++,发现它是BGGY,从来没有为我编译过。我试过libserial它工作得很好,但在接收端,我需要将read(fd, &buffer, sizeof(buffer));保持在while循环中以持续打开进行监听,而不像C套接字程序那样,read()函数将停止直到接收到数据,就像我的python脚本将排队等待incoming = ser.readline().strip()直到它接收到一些消息一样。没有使用while循环有什么解决方案吗?编辑1:在前面提到的python代码中,while循环用于接收多条消息。行incoming = ser.readline().strip()将捕获消息,处理它并等待下一条消息,因为它在while循环中。如果我的代码是这样的:while(1){ str = read(); //some processing }它抛出错误,因为read在获取数据之前不会停止,它只是返回read fail。由于读取的数据NULL,数据的后处理将抛出错误。为了让它工作,我引入了另一个类似这样的循环: while(1){ while(1){ str = read(); if(str!=NULL) break; } //some processing }我想消除这个额外的循环并使while等待消息。PS:我正在打开这样的串行设备:read() 最佳答案 如果您不希望连接是非阻塞的,那么您可能需要删除已添加到open调用中的打开非阻塞的“显示”选项。就这样。。。uart0_filestream = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);另外,read不返回字符串,它返回读取的字节数,因此对read的调用应该更像bytecount = read(uart0_filestream, str, 20);if(bytecount>0) { str[bytecount]='\0'; }else { // Something bad happened? }关于c - Raspberry Pi的C串行通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51609813/
10-11 22:10
查看更多