C++ 不将整个数据写入 UART 端口

C++ not writing whole data to UART port

我一直在使用 wiringPi 在 C++ 中测试 UART 通信。

问题:

C++ 似乎没有将整个数据输出到 UART 端口 /dev/ttyAMA0。也许我做错了?

调查:

注意:我正在使用minicomminicom --baudrate 57600 --noinit --displayhex --device /dev/ttyAMA0检查接收到的数据。

还有!串口,RX & TX针脚短接在一起。

python 代码运行完美,但是当我尝试用 C++ 实现它时,收到的数据不同。

预期收到的数据应该是:ef 01 ff ff ff ff 01 00 07 13 00 00 00 00 00 1b.

收到的数据比较:

使用的语言 从 Minicom 接收到数据
Python ef 01 ff ff ff ff 01 00 07 13 00 00 00 00 00 1b
C++ ef 01 ff ff ff 01

使用代码

Python:

import serial
from time import sleep

uart = serial.Serial("/dev/ttyAMA0", baudrate=57600, timeout=1)

packet = [239, 1, 255, 255, 255, 255, 1, 0, 7, 19, 0, 0, 0, 0, 0, 27]

uart.write(bytearray(packet))

C++:

注意:使用g++ -Wall -O3 -o test hello.cpp -lwiringPi

编译的代码
#include <iostream>
#include <string.h>
#include <wiringPi.h>
#include <wiringSerial.h>

using namespace std;

int main()
{

      int serial_port;

      if (wiringPiSetup() == -1)
            exit(1);

      if ((serial_port = serialOpen("/dev/ttyAMA0", 57600)) < 0)
      {
            fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno));
            return 1;
      }

      cout << "Sending data to UART" << std::endl;

      serialPuts(serial_port, "\xef\x01\xff\xff\xff\xff\x01\x00\x07\x13\x00\x00\x00\x00\x00\x1b");

      return 0;
}

您不能使用 serialPuts 发送空终止符。与所有类似的函数一样,它会在字符串中遇到空终止符时停止。在这种情况下,我认为您最好的选择是添加一个函数,该函数使用 WiringPi 自己的函数在内部使用的普通 write 函数。

您可以制作一个包装函数,使其看起来与其他调用类似:

#include <cstddef>

void serialWrite(const int fd, const char* data, size_t length) {
    write(fd, data, length);
}

也许还有一个函数模板,不必手动计算固定数据数组中数据的长度:

template<size_t N>
void serialWrite(const int fd, const char(&data)[N], bool strip_last = true) {
    serialWrite(fd, data, N - strip_last);
}

您现在可以像这样使用它了:

serialWrite(serial_port, "\xef\x01\xff\xff\xff\xff\x01\x00\x07\x13\x00\x00\x00\x00\x00\x1b");

注意:有一个 pull request 可以向 WiringPi 库添加一个类似的功能(称为 serialPut),如果您不这样做,您可以下载而不是使用 master 分支版本中的官方版本不想做自己的功能。