我想在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,Baudrate是,必须是9600。
答案 0 :(得分:0)
查看man:
read() 尝试从文件描述符fd读取最多计数字节到从buf开始的缓冲区。
换句话说,read
不授予返回其他任务发送的所有字节的权限,可以为您提供最多sizeof(rfid_read_buffer)-1
你能做的是:
rfidCom
读取循环,直到字符数与发送的字符数相匹配。 例如:
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;
}
答案 1 :(得分:0)
好的,我认为我找到了解决问题的方法。
void *rfid_to_uart_thread(void *) {
char rfid_read_buffer[10];
ssize_t writeCounter = -1;
do {
writeCounter = read(rfidCom, &rfid_read_buffer, sizeof(rfid_read_buffer)-1);
if (writeCounter>0){
rfid_read_buffer[writeCounter] = 0;
LOGE("RFID -> UART: %s", rfid_read_buffer);
write(uartCom, rfid_read_buffer, writeCounter);
}else{
usleep(25);
}
tcdrain(uartCom);
} while (!bKillBridgeThreads);
return NULL;}
我已经为tcdrain创建了自己的定义,因为我使用的Android NDK没有在termios.h中提供它 现在,所有值似乎都传输到UART端口。
tcdrain现在定义为:
#define tcdrain(fd) ioctl(fd, TCSBRK, 1)