This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

求教:串口一直发送是怎么回事呢?



在协议栈上做串口透传的实验,打开串口助手发现一直在执行串口回调函数,这是为什么呢?

而且当手机给模块发送信息时串口助手上也是显示两条相同的信息,求教大神指点一下,该怎么办呢?

  • 1 把串口回调的数据打印出来,你可以这么写,

    static void SerialCallback(uint8 port, uint8 event)
    {
        if(Hal_UART_RxBufLen(port))
        {
            read_data(data);
            serial_print(data);
            ...
        }
    
    }
    

    当然不一定是有数据来才进回调的,

    /* UART Events */
    #define HAL_UART_RX_FULL 0x01
    #define HAL_UART_RX_ABOUT_FULL 0x02
    #define HAL_UART_RX_TIMEOUT 0x04
    #define HAL_UART_TX_FULL 0x08
    #define HAL_UART_TX_EMPTY 0x10

    这几种事件都有可能进入回调函数中

    2 串口助手你有没有选择保存发送?

  • 谢谢 admsadm。我的串口程序是这样的

    if ( numBytes = Hal_UART_RxBufLen(port) )
      {
         (void)HalUARTRead (port, pktBuffer,numBytes);
          HalLcdWriteString(pktBuffer, HAL_LCD_LINE_5 );
          sbpSerialAppSendNoti(pktBuffer,numBytes);  

    但是不行啊,当有信息发过来时,串口助手上还是连续显示两个相同的信息。求指教

  • 啥意思?

    比如本来应该接收hello的变成了hheelllloo这样?还是hellohello这样?

    还有你这边串口的发送函数是这个:sbpSerialAppSendNoti?

    最好把有关于串口发送那部分也贴出来,因为你不是说串口上面显示了两个相同的信息么。要么是串口调试上面有保存发送功能,要么你接收的时候再次发送了,要么你连续调用了发送函数。

  • 显示的信息成了hellohello.

    void sbpSerialAppSendNoti(uint8 *pBuffer,uint16 length)
    {
    uint8 len;
    if(length > 20) len=19;
    else
    len = length;
    static attHandleValueNoti_t pReport;
    pReport.handle=0x2E;
    pReport.len = len;
    osal_memcpy(pReport.value, pBuffer, len);
    GATT_Notification( 0, &pReport, FALSE );
    }这是透传的程序,应该没问题的。

    串口助手上没有保存发送的功能啊,我试了其他的程序可以的。至于接收之后在把信息发出去好像也没有,而且我也没在其他地方发送了啊,只在串口回调中接收了一次数据

  • 那肯定是你发送了两次吧。其他想不出来还有什么原因了

  • 方便的话把你整个回调函数贴一下

  • 回调函数就是这个啊

    i

    void sbpSerialAppCallback(uint8 port, uint8 event)
    {
    uint8 pktBuffer[SBP_UART_RX_BUF_SIZE];
    (void)event;
    if ( numBytes = Hal_UART_RxBufLen(port) )
    {

    (void)HalUARTRead (port, pktBuffer,numBytes);
    HalLcdWriteString(pktBuffer, HAL_LCD_LINE_5 );
    sbpSerialAppSendNoti(pktBuffer,numBytes);

    }

    我用手机和BTOOL发送的数据,模块这边负责接收,然后在串口上显示出来