迪文科技论坛

 找回密码
 立即注册
搜索
查看: 478|回复: 6

【提问】UART5 串口5初始化后,接收数据有问题

[复制链接]

3

主题

6

回帖

100

积分

注册会员

Rank: 2

积分
100
发表于 2022-10-21 15:41:54 | 显示全部楼层 |阅读模式
设备型号:DMG10600T101_A5WTC(串口2是 RS232、串口4是RS485、串口5是RS232)


已经正常使用串口2和串口4,目前需要启用串口5,参考前两个串口初始化代码写了初始化代码
测试发现对端发送数据在屏幕上接收到的数据总是在前端加了一些不知道哪来的东西


比如:


对端发送:     a548 0931 0000 05a3 ffff fec5 0041 3506
接收到的:c0 a548 0931 0000 05a3 ffff fec5 0041 3506   


就是前边多了一个c0,有的时候是00 或者 80  之类的,也有的时候是完全不对的数据

不知道是哪里有问题。




代码如下:


xdata u16 uart5_rx_sta;                       //bit15用于标志是否已接受到一个完整的数据包,bit14:0用于存储当前数据包的长度
xdata u8  uart5_buf[UART5_PACKET_MAX_LEN+2];  //留2个空字符的位置

u16 g_uart5_mstick = 0;  //用于判断数据发送间隔






//用于使用者调用设置波特率,需要先注册波特率再初始化串口
void uart5_SetBaud(u32 ulBaud)
{
    u32 baud;


    //T5L主频为206.4384MHZ,BODE3_DIV_H = 主频/(8*波特率)
    baud = (u16)(25804800.0f/ulBaud);
    BODE3_DIV_H=(baud>>8)&0xff;
    BODE3_DIV_L=baud&0xff;
}


void uart5_TimerHandle()
{
        //时间间隔结束方式使能
        if(uart5_rx_sta&UART5_PACKET_OK)//接收好的数据还未被处理,当前并不是等待数据处理状态
                return;
       
        if((uart5_rx_sta&UART5_PACKET_LEN) == 0)  //没有接收到数据
                return;
       
        //已经接收到数据,开始计数
        g_uart5_mstick ++;
       
        if (g_uart5_mstick > UART5_END_INTERVAL_MS)
        {
                //达到间隔,此帧数据结束
                uart5_rx_sta |= UART5_PACKET_OK;//标记数据包接受完成
                g_uart5_mstick = 0;
        }
}




void UART5_Init(void)
{
    SCON3T=0x80;
    SCON3R=0x80;
   
    uart5_SetBaud(UART5_BAUD_DEFAULT);    //9600默认波特率
   
    //ES3T=1;
    ES3R=1;
    //RS485_TX_EN=0;
    EA=1;
    TR5 = 0;


    uart5_rx_sta = 0;
    g_uart5_mstick = 0;
}




//发送数据
void Uart5_SendData(u8 *bytes,u16 len)
{
        u16 i;
       
        for(i=0;i<len;i++)
        {   
                SBUF3_TX = bytes;
                while((SCON3T&0x01)==0);
        SCON3T &=0xFE;
        }
}




void UART5_TX_ISR_PC(void)    interrupt 12
{
    SCON3T&=0xFE ;
}






void uart5_isr()        interrupt 13
{
        u8 res;


    //EA=0;
    if((SCON3R&0x01)==0x01)
    {
        SCON3R&=0xFE;
        res=SBUF3_RX;


        if(uart5_rx_sta&UART5_PACKET_OK)//接收好的数据还未被处理
        {
            //EA=1;
                        return;
        }


        g_uart5_mstick = 0;//只要有数据来就重新记时
                       
                if(uart5_rx_sta>=UART5_PACKET_MAX_LEN)
            uart5_rx_sta = 0;//数据超量了,丢弃掉,重头开始接收


                uart5_buf[uart5_rx_sta++] = res;//存储有效数据
   
    }
    //EA=1;
}


回复

使用道具 举报

2

主题

665

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10036
发表于 2022-10-21 16:05:59 | 显示全部楼层
您好,请参考下方51程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

3

主题

6

回帖

100

积分

注册会员

Rank: 2

积分
100
 楼主| 发表于 2022-10-22 09:42:42 | 显示全部楼层
Bensenl 发表于 2022-10-21 16:05
您好,请参考下方51程序

这个是代码是比较老的么?是不是和T5L不对应? 我看初始化函数里串口5使用的是
SCON5T=0x80;
SCON5R=0x80;
而我看文档里写的串口5应该是:
SCON3T=0x80;
SCON3R=0x80;
回复

使用道具 举报

16

主题

57

回帖

347

积分

中级会员

Rank: 3Rank: 3

积分
347
发表于 2022-10-25 21:55:12 | 显示全部楼层
ren272 发表于 2022-10-22 09:42
这个是代码是比较老的么?是不是和T5L不对应? 我看初始化函数里串口5使用的是
SCON5T=0x80;
SCON5R=0x80 ...

我也是被这个给弄糊涂了。
回复

使用道具 举报

0

主题

932

回帖

4985

积分

论坛元老

Rank: 8Rank: 8

积分
4985
发表于 2022-10-26 08:58:28 | 显示全部楼层
gdchczd 发表于 2022-10-25 21:55
我也是被这个给弄糊涂了。

寄存器命名习惯不同,地址对应上就行。
回复

使用道具 举报

0

主题

1

回帖

55

积分

注册会员

Rank: 2

积分
55
发表于 2023-4-15 16:28:27 | 显示全部楼层
UART5_PACKET_OK定义的是什么
回复

使用道具 举报

0

主题

756

回帖

4578

积分

论坛元老

Rank: 8Rank: 8

积分
4578
发表于 2023-4-17 08:44:05 | 显示全部楼层
数据包接收完成标志
只会hellowrold
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-4-28 12:34 , Processed in 0.083034 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表