多串口配置

常规项目默认只支持一个串口,如果您要使用双串口,甚至多串口,请下载DoubleUartDemo样例, 该样例在常规项目中修改了串口部分代码,以支持多串口。

变更

变更部分见如下说明。

  • uart部分代码经过修改,所以项目属性里的串口配置失效。
  • 串口号及波特率请参照 jni/uart/UartContext.cpp 文件中的 init()函数修改。

    void UartContext::init() {
        uart0 = new UartContext(UART_TTYS0);
        uart0->openUart("/dev/ttyS0", B9600);
    
        uart1 = new UartContext(UART_TTYS1);
        uart1->openUart("/dev/ttyS1", B9600);
    }
    
  • 发送数据到指定串口

      unsigned char buf[2] = {1, 1};
      sendProtocolTo(UART_TTYS1, 1, buf, 2); //发送到TTYS1串口
    
      unsigned char buf[2] = {0};
      sendProtocolTo(UART_TTYS0, 1, buf, 2);//发送到TTYS0串口
    
  • 接收串口数据的方式与常规项目相同
    如果需要区分数据来自哪一个串口,建议在SProtocolData 结构体中添加一个字段标识该帧来自哪一个串口。

    修改 uart/ProtocolData.h

    typedef struct {
          BYTE power;
          int uart_from; //来自哪一个串口
    } SProtocolData;
    

    修改 uart/ProtocolParser.cpp

      /**
       * 解析每一帧数据
       */
      static void procParse(int uart, const BYTE *pData, UINT len) {
          // CmdID
          switch (MAKEWORD(pData[3], pData[2])) {
          case CMDID_POWER:
              sProtocolData.power = pData[5];
              break;
          }
    
          sProtocolData.uart_from = uart; //标识该帧来自哪一个串口
          // 通知协议数据更新
          notifyProtocolDataUpdate(sProtocolData);
      }
    

    然后在Logic.cc中,可以使用uart_from字段判断该数据来自哪一个串口。

    static void onProtocolDataUpdate(const SProtocolData &data) {
        LOGD("onProtocol %d", data.uart_from);
    
        char buf[128] = {0};
        snprintf(buf, sizeof(buf), "收到串口 %d的数据", data.uart_from);
        mTextview1Ptr->setText(buf);
    }
    

样例代码

完整代码见样例代码 里的 DoubleUartDemo 工程

powered by Gitbooklast modified: 2021-05-28 12:00:31

results matching ""

    No results matching ""