Последовательный порт получает на два байта больше отправленного - PullRequest
0 голосов
/ 16 декабря 2018

Моя установка выглядит следующим образом: старая машина с Windows XP, у которой все еще есть реальный последовательный порт, и более новая машина с Windows 7, которая использует адаптер USB-Serial.Я пытаюсь запустить пример 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

Вы можете видеть, что в последней операции последовательной записи неожиданно оказалось на два байта больше (0x00fc), чем должно быть.Это почему?Откуда эти двое, пожалуйста?Я этого не понимаюКроме того, выходные данные тестовой программы, показанные выше, ясно показывают, что отправляется только 1 байт:

[*] 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 поступает 3 байта в последней операции записи?

Я проверил, что настройки скорости передачи, битов данных, контроля четности, управления потоком и стоп-битами одинаковы на обеих машинах, и они также соответствуют скорости передачи данных, установленной в приведенном выше коде (9600 бод), поэтому я действительно понятия не имею, что там не так,Кто-нибудь здесь, кто может рассказать больше, пожалуйста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...