gpt4 book ai didi

C语言连接两个串口

转载 作者:行者123 更新时间:2023-11-30 16:58:22 28 4
gpt4 key购买 nike

我想在 C 语言中连接/桥接两个串口。我有 2 个线程读取端口并写入另一个端口。这是一个例子:

void *rfid_to_uart_thread(void *) {
char rfid_read_buffer[100];
int writeCounter;
do {
writeCounter = read(rfidCom, rfid_read_buffer, sizeof(rfid_read_buffer)-1);
if (writeCounter > 0) {
write(uartCom, rfid_read_buffer, writeCounter);
} else
usleep(25);



} while (!bKillBridgeThreads);

return NULL;}

问题是,写入似乎太慢了。我经常在另一侧只收到一半的字符串。看起来写入是异步的,因此缓冲区在下一个循环中再次被覆盖并覆盖最后一个“写入”,从而导致数据被破坏?!是这样吗?

端口已打开 NON_BLOCKING 和 RW,波特率必须为 9600。

最佳答案

查看man :

read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf.

换句话说,read 不允许返回其他任务发送的所有字节,可以为您提供最多 sizeof(rfid_read_buffer)-1

你能做的是:

  1. 循环读取rfidCom,直到字符数与发送的字符数匹配。
  2. 您可以使用特定的消息终止符并检查它以验证收到的消息
  3. 将字符封装到带有嵌入消息长度的 header 的协议(protocol)消息中,以便接收方可以计算接收到的字符并在收到最后一个字符时停止读取。

例如:

void *rfid_to_uart_thread(void *)
{
char rfid_read_buffer[100] = {0};

int writeCounter;
char RXchar;
ssize_t retVal;
bool send = false;

do
{
memset(rfid_read_buffer, 0x00, sizeof(rfid_read_buffer));
send = true;

do
{
retVal = read(rfidCom, &RXchar, 1);

if (retVal > 0)
{
rfid_read_buffer[writeCounter] = RXchar;

writeCounter++;
}
else if (retVal < 0)
{
send = false;
RXchar = '\r'
break;
}
else
{
usleep(25);
}
}
while(RXchar != '\r');


if (send)
{
write(uartCom, rfid_read_buffer, writeCounter);
}
}
while (!bKillBridgeThreads);

return NULL;
}

关于C语言连接两个串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38866144/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com