代码之家  ›  专栏  ›  技术社区  ›  Andreas

串行端口接收的字节比发送的多两个

  •  0
  • Andreas  · 技术社区  · 6 年前

    我的设置是这样的:一台旧的Windows XP机器仍然有一个真正的串行端口,一台新的Windows 7机器使用USB串行适配器。我在试着运行 librs232 示例如下:

    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    
    #include "librs232/rs232.h"
    
    unsigned int err(unsigned int e);
    unsigned int rs232_simple_test(void);
    
    unsigned int err(unsigned int e)
    {
        printf("%s (%s)\n", rs232_strerror(e), errno > 0 ? strerror(errno) : "");
        return e;
    }
    
    unsigned int rs232_simple_test(void)
    {
        unsigned int try = 0;
        unsigned int bytes = 0;
        unsigned char data[1];
        unsigned int ret = 0;
        struct rs232_port_t *p = NULL;
    
        p = rs232_init();
        if (p == NULL)
            return 1;
    
    #ifdef WIN32
        rs232_set_device(p, "COM1");
    #else
        rs232_set_device(p, "/dev/ttyUSB0");
    #endif
        ret = rs232_open(p);
        if (ret) {
            rs232_end(p);
            return err(ret);
        }
    
        rs232_set_baud(p, RS232_BAUD_9600);
        printf("[*] port settings: %s\n", rs232_to_string(p));
    
        rs232_flush(p);
        while (try++ < 10) {
            printf("%02d. [*] read: ", try);
            data[0] = 0x00;
            ret = rs232_read_timeout(p, data, 1, &bytes, 1000);
            if (ret)
                err(ret);
            else
                printf("0x%02x len: %d\n", data[0], bytes);
    
            data[0] = 0x05;
            bytes = 0;
            printf("%02d. [*] write: ", try);
            ret = rs232_write_timeout(p, data, 1, &bytes, 1000);
            if (ret)
                err(ret);
            else
                printf("len: %d\n", bytes);
        }
    
        rs232_end(p);
        return 0;
    }
    
    int main()
    {
        return rs232_simple_test();
    }
    

    此代码连续十次将字符0x05发送到COM1。我在我的Win7机器上运行测试程序。但是,WinXP机器上的输出是:

    0x05
    0x05
    0x05
    0x05
    0x05
    0x05
    0x05
    0x05
    0x05
    0x0500fc
    

    [*] port settings: device: COM1, baud: 9600, data bits: 8, parity: none, stop bits: 1, flow control: off
    01. [*] read: timeout error (No such file or directory)
    01. [*] write: len: 1
    02. [*] read: timeout error (No such file or directory)
    02. [*] write: len: 1
    03. [*] read: timeout error (No such file or directory)
    03. [*] write: len: 1
    04. [*] read: timeout error (No such file or directory)
    04. [*] write: len: 1
    05. [*] read: timeout error (No such file or directory)
    05. [*] write: len: 1
    06. [*] read: timeout error (No such file or directory)
    06. [*] write: len: 1
    07. [*] read: timeout error (No such file or directory)
    07. [*] write: len: 1
    08. [*] read: timeout error (No such file or directory)
    08. [*] write: len: 1
    09. [*] read: timeout error (No such file or directory)
    09. [*] write: len: 1
    10. [*] read: timeout error (No such file or directory)
    10. [*] write: len: 1
    

    那么,为什么在最后一次写入操作中,WinXP PC上会出现3个字节呢?

    0 回复  |  直到 6 年前