迪文科技论坛

 找回密码
 立即注册
搜索
查看: 210|回复: 8

【提问】DMG48270C043_04WTC串口2接收和发出数据乱码

[复制链接]

1

主题

3

回帖

50

积分

注册会员

Rank: 2

积分
50
发表于 2024-2-13 22:07:06 | 显示全部楼层 |阅读模式
DMG48270C043_04WTC串口2,先是试着用屏幕向电脑发送的一个字符串在串口助手上显示乱码了;printf("T5L_C51:%s\r\n");
然后将熊家余的源码考进屏幕了,没有反应。
void main(void)
{   u16 len;
        sys_init();//系统初始化
        uart2_init(115200);//初始化串口2
        while(1)
        {  if(uart2_rx_sta&UART2_PACKET_OK)//接受到了串口数据包
                {
                        len = uart2_rx_sta&UART2_PACKET_LEN;//得到串口数据包的长度,不包含"\r\n"或者'\n'结束符的长度
                        uart2_buf[len++] = 0;//在末尾添加2个空字符
                        uart2_buf[len++] = 0;
                        
                        printf("T5L_C51:%s\r\n",uart2_buf);//把接受到的数据包加上"T5L_C51:"前缀后返还给发送者
                        sys_write_vp(0x2000,uart2_buf,len/2+1);//同时把数据包显示到界面上
                        
                        uart2_rx_sta = 0;//清0代表处理掉了此串口包
                }}}
最后把源码中主函数的“接受到了串口数据包”的if条件去掉,发现屏幕和电脑能正常通信,但是都是乱码;
void main(void)
{   u16 len;
        sys_init();//系统初始化
        uart2_init(115200);//初始化串口2
        while(1)
        {  
                        len = uart2_rx_sta&UART2_PACKET_LEN;//得到串口数据包的长度,不包含"\r\n"或者'\n'结束符的长度
                        uart2_buf[len++] = 0;//在末尾添加2个空字符
                        uart2_buf[len++] = 0;
                        
                        printf("T5L_C51:%s\r\n",uart2_buf);//把接受到的数据包加上"T5L_C51:"前缀后返还给发送者
                        sys_write_vp(0x2000,uart2_buf,len/2+1);//同时把数据包显示到界面上
                        
                        uart2_rx_sta = 0;//清0代表处理掉了此串口包
                }}

希望哪位大佬能帮我解决一下,卡在这里几天了,
回复

使用道具 举报

0

主题

222

回帖

6532

积分

论坛元老

Rank: 8Rank: 8

积分
6532
发表于 2024-2-15 13:23:08 | 显示全部楼层
楼主发一下完整的程序,上班后工程师协助排查一下
回复

使用道具 举报

1

主题

3

回帖

50

积分

注册会员

Rank: 2

积分
50
 楼主| 发表于 2024-2-15 17:49:49 | 显示全部楼层
一袋米好重 发表于 2024-2-15 13:23
楼主发一下完整的程序,上班后工程师协助排查一下

就是熊家余的源程序,主程序如下:
#include "sys.h"
#include "uart2.h"
void main(void)
{   
        u16 len;
        sys_init();//系统初始化
        uart2_init(115200);//初始化串口2
        while(1)
        {   if(uart2_rx_sta&UART2_PACKET_OK)//接受到了串口数据包
                {len = uart2_rx_sta&UART2_PACKET_LEN;//得到串口数据包的长度,不包含"\r\n"或者'\n'结束符的长度
                        uart2_buf[len++] = 0;//在末尾添加2个空字符
                        uart2_buf[len++] = 0;
                        printf("T5L_C51:%s\r\n",uart2_buf);//把接受到的数据包加上"T5L_C51:"前缀后返还给发送者
                        sys_write_vp(0x2000,uart2_buf,len/2+1);//同时把数据包显示到界面上
                        uart2_rx_sta = 0;//清0代表处理掉了此串口包
                }}}
初始化串口2
void uart2_init(u32 baud)
{
        MUX_SEL |= 0x40;//bit6置1表示将uart2接口引出到P0.4和P0.5
        P0MDOUT &= 0xCF;
        P0MDOUT |= 0x10;//设置对应的IO口输出输入
        ADCON = 0x80;//选择SREL0H作为波特率发生器
        SCON0 = 0x50;//接受使能和模式设置
        PCON &= 0x7F;//SMOD=0
        //波特率设置,公式为:
        //SMOD=0  SREL0H=1024-主频/(64*波特率),SMOD=1         SREL0H=1024-主频/(32*波特率)
        baud = 1024-(u16)(3225600.0f/baud);
        SREL0H = (baud>>8)&0xff;  
        SREL0L = baud&0xff;
       
        #if(UART2_INT_EN)
                ES0 = 1;//中断使能
                EA = 1;
                //xdata变量都得在函数中初始化
                uart2_rx_sta = 0;
                uart2_step = 0;
        #else
                ES0 = 0;
        #endif
}
中断函数
void uart2_isr()        interrupt 4
{
        u8 res;
       
        if(RI0)//是串口接受中断
        {
                RI0 = 0;//清除接受中断标志
                res = SBUF0;//读取串口数据
               
                if(uart2_rx_sta&UART2_PACKET_OK)//接收好的数据还未被处理
                        return;
       
                if(uart2_step==0)//接受数据的过程
                {
                        if(res=='\r')//如果接受到了"\r\n"结束标记,认为数据包接受完成
                                uart2_step = 1;//进入接受'\n'标记的过程
                        else if(res=='\n')//如果接受到了'\n'结束标记,也认为数据包接受完成
                                uart2_rx_sta |= UART2_PACKET_OK;//标记数据包接受完成
                        else//接受数据
                        {
                                if(uart2_rx_sta>=UART2_PACKET_MAX_LEN)
                                        uart2_rx_sta = 0;//数据超量了,丢弃掉,重头开始接收

                                uart2_buf[uart2_rx_sta++] = res;//存储有效数据
                        }
                }else if(uart2_step==1)//判断结束标记的过程
                {
                        uart2_step = 0;
                        if(res=='\n')
                                uart2_rx_sta |= UART2_PACKET_OK;//标记数据包接受完成
                        else
                                uart2_rx_sta = 0;//'\r'的下一个字符不是'\n',认为接受错误,重头开始接收
                }
               
        }       
}
#endif

回复

使用道具 举报

1

主题

14

回帖

189

积分

注册会员

Rank: 2

积分
189
发表于 2024-2-15 23:12:48 | 显示全部楼层
如果只是为了测试串口能否正常通信,没必要用以上代码,以上代码在中断里写了过多的具体业务逻辑判断,实际开发也不会这么写,通常都是用环形队列做一个接收缓冲区,中断只负责数据接收,接收数据放入缓冲区里,逻辑判断在主函数里执行,发送同理。简单测试串口的通信,可以初始化完串口后,在串口中断做个简单的数据回环即可,即把接收的单字节数据原样发回去。如果嫌麻烦,可以找官方要一份研发的参考程序(不是官网下的那个,那个写的更乱),更具有参考性。
回复

使用道具 举报

1

主题

3

回帖

50

积分

注册会员

Rank: 2

积分
50
 楼主| 发表于 2024-2-16 13:08:47 | 显示全部楼层
hicccp 发表于 2024-2-15 23:12
如果只是为了测试串口能否正常通信,没必要用以上代码,以上代码在中断里写了过多的具体业务逻辑判断,实际 ...

不用中断也是乱码的;
直接在主函数中发送,接受数据都是乱码的,
回复

使用道具 举报

1

主题

14

回帖

189

积分

注册会员

Rank: 2

积分
189
发表于 2024-2-17 21:15:34 | 显示全部楼层
我在 发表于 2024-2-16 13:08
不用中断也是乱码的;
直接在主函数中发送,接受数据都是乱码的,

单纯的用SBUF接收和发送一个字节,如果还乱码说明初始化好串口或者硬件接线有问题。
回复

使用道具 举报

0

主题

222

回帖

6532

积分

论坛元老

Rank: 8Rank: 8

积分
6532
发表于 2024-2-18 08:51:36 | 显示全部楼层
建议用这个模版测试

本帖子中包含更多资源

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

x
回复

使用道具 举报

1

主题

3

回帖

50

积分

注册会员

Rank: 2

积分
50
 楼主| 发表于 2024-2-28 17:25:49 | 显示全部楼层
一袋米好重 发表于 2024-2-18 08:51
建议用这个模版测试

你好,又没有这个的使用方法,学习资源什么的。嘿嘿,基础不太好不怎么会用
回复

使用道具 举报

0

主题

312

回帖

3572

积分

论坛元老

Rank: 8Rank: 8

积分
3572
发表于 2024-2-29 08:37:00 | 显示全部楼层
您好,可以参考这个链接。
【教学视频】T5L_ASIC视频教学合集
http://inforum.dwin.com.cn:20080 ... 9&fromuid=43596
(出处: 迪文科技论坛)
我不在我不在
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 00:34 , Processed in 0.088000 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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