CH582串口中断模式、如何实现大于7位字符的数据传输?

 * @fn      UART1_IRQHandler

 *

 * @brief   UART1中断函数

 *

 * @return  none

 */

__INTERRUPT

__HIGH_CODE

void UART1_IRQHandler(void)

{

    volatile uint8_t i;

    switch(UART1_GetITFlag())

    {

        case UART_II_LINE_STAT: // 线路状态错误

        {

            UART1_GetLinSTA();

            break;

        }

        case UART_II_RECV_RDY: // 数据达到设置触发点

            for(i = 0; i != trigB; i++)

            {

                RxBuff[i] = UART1_RecvByte();

                UART1_SendByte(RxBuff[i]);

               UART3_SendByte(RxBuff[i]);//串口1接收的数据同时发送串口3

            }

            break;

        case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成

            i = UART1_RecvString(RxBuff);

            UART1_SendString(RxBuff, i);

            break;

        case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送

            break;

        case UART_II_MODEM_CHG: // 只支持串口0

            break;

        default:

            break;

    }

}


您好,默认代码就可以接收7个字节以上的数据,需要用户代码做好接收缓存。

使用您的代码,出现了什么现象呢,串口打印信息可以截个图吗。

以下博客中的代码可以实现串口间透传,供您参考。

https://www.cnblogs.com/JayWellsBlog/p/15950692.html


您好,我在源代码的基础上在中断函数里进行了数据转存,在主函数里判断后发送;

while(1)

 {

if(uart1RxBuff[0]==0x31)

{

    UART3_SendString(uart1RxBuff,32);//发送32位定长

    uart1RxBuff[0]=0x00;

}

}

串口截图如下:

1.png串口1发送16个数据,返回14位;串口3显示接收32,有效数据只有7位。也就是最多只能接收7位数据。



您好,中断中的接收越快越好,接收占用时间过长,会影响到串口1下一包数据的接收,串口打印、数据转发等等都需要时间。

串口3那边只收到7个字节有效数据,推测是由于串口1第一包接收的数据开头为0x31,满足if(uart1RxBuff[0]==0x31),后续的数据开头没有‘1’,不发送。


您好,感觉不是您推测的那样,一个字符串,“数组0”里的内容符合条件就执行,这个没毛病的,之前其它芯片也这么写都可以正确执行的。那您看下Uart1的窗口发出16个数据返回14个数据是什么原因?这个是在接收的同时直接输出的


串口1FIFO中缓存到7个字节就全部取出,第一次取出的数据确实是‘1’开头的,中断完后在主函数中发出没问题。检查一下第二次取出的以及最后一次在TOUT case中取出的数据,还是不是‘1’开头的呢。

默认例程中,串口1接收中断中直接回传数据,在波特率115200下是可行的,不清楚您的代码还有哪些修改,您可以发送工程至邮箱zhaiyw@wch.cn帮您看下。


       只是在源代码的基础上添加了Uart3,删除了原来的查询方式。代码已发送,麻烦帮实现下收发数据长度大于7的功能。谢谢!


您好,已将修改后的代码发送至您邮箱。修改思路按贴子中的博客修改的,您仔细看看博客。也可以将相关变量写在结构体中,更有条理些。如果您的需求更苛刻些,比如说串口数据发送间隔更短,建议使用环形缓冲区缓存数据。


TECH_JW您好!

      感谢您的帮助;刚刚测试了您修改后的代码,效果不理想哦,芯片会死机,有单纯中断模式来实现的么?比如:一帧数据32位,或64位,接收完成就在缓存区缓存,而不是在while循环里查询几时接收完成这样。截图如下:

1.png

另外您提到的环形缓冲区缓存数据这个是纯粹中断模式实现接收么?


  这是用源代码中的纯粹中断法,代码结构和位置和上面那个测试是一样的,测试的截图:

2.png

数据没报错,芯片没死机。


您好,邮件提供的只是串口1与串口3的透传,没有涉及TMOS系统,您在本帖中也没有提该需求。

之前提过,在TMOS系统中使用串口的话可以参考BLE_UART例程,您可以自行移植。

如果实在没有开发能力,可以致电官网的技术支持,评估一下是否需要代开发。


你好,请教一下是如何实现单独保存7字节以上数据,我使用strcat(TestBuf1,RxBuff)来进行6字节拼接,发现不稳定,有概率乱码。



可以发送邮件至邮箱hy@wch.cn ,给你发送一个串口接收的例程供参考。


看上去问题在于串口读取函数一次读取只能得到有限的数据,可以考虑约定结束符,循环读取串口数据填入数组,直到超时或者碰到结束符或者数组填满为止。


只有登录才能回复,可以选择微信账号登录