在C中连接两个串口

时间:2016-08-10 06:48:26

标签: c multithreading serial-port uart tty

我想在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。

2 个答案:

答案 0 :(得分:0)

查看man

  

read() 尝试从文件描述符fd读取最多计数字节到从buf开始的缓冲区。

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

的单个字节

你能做的是:

  1. rfidCom读取循环,直到字符数与发送的字符数相匹配。
  2. 您可以使用特定的消息终止符并检查消息以验证收到的消息
  3. 将字符封装到协议消息中,该消息带有嵌入消息长度的标头,因此接收方可以对接收到的字符进行计数,并在收到最后一个字符时停止读取。
  4. 例如:

    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)