找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1466|回复: 15
打印 上一主题 下一主题
收起左侧

STM32F103单片机发送字符到串口调试工具,前面的几个位置乱码

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
最近无聊说学习一下串口通信,控制595。595的已经用仿真软件测试通过了,现在试想用串口控制595.代码复制粘贴完(cv工程师嘛,你懂的),上串口工具测试。好了乱码了。但是这个乱码好奇怪,发一大串字符过去,接收到的只是前面的几个位置乱了,后面的就显示正常(如图1)。
如果发送两行,第一行乱码,第二行是正常的(如图2)。
百度了说是晶振频率不对,我也看了,都是对的。也有说波特率不对的,都一一试了,还是有问题。
电脑也换了试过,usb转com的线也换了试,一样不行。没招了。
以前有用个f103zet6做的一个小玩意,也使用了串口通信,那个产品一点问题都没有。
麻烦大佬帮忙看看。感谢!!!

下面是单片机代码

void HC595_USART_Init(void)
    {
                    GPIO_InitTypeDef GPIO_InitSturct;
        NVIC_InitTypeDef NVIC_InitSturct;
        USART_InitTypeDef USART_InitSturct;
                    
        /***************************时钟使能****************************/
        //串口1时钟使能
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        //GPIOA端口使能(PA9-USART_TX,PA10-USART_RX)
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

        /************************GPIO端口初始化************************/
        //PA9-USART_TX
        GPIO_InitSturct.GPIO_Mode = GPIO_Mode_AF_PP;    //推挽复用输出
        GPIO_InitSturct.GPIO_Pin =  GPIO_Pin_9;
        GPIO_InitSturct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitSturct);  //初始化串口

        //PA10-USART_RX
        GPIO_InitSturct.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //浮空输入
        GPIO_InitSturct.GPIO_Pin =  GPIO_Pin_10;
        GPIO_InitSturct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitSturct);  //初始化串口

        /***************************USART1参数初始化配置***************************/
        USART_InitSturct.USART_BaudRate = bound;   //波特率设置为115200
        USART_InitSturct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    //无硬件数据流控制
        USART_InitSturct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;  //收发
        USART_InitSturct.USART_Parity = USART_Parity_No;    //无奇偶校验位
        USART_InitSturct.USART_StopBits = USART_StopBits_1; //一个停止位
        USART_InitSturct.USART_WordLength = USART_WordLength_8b;    //字长为8位
        USART_Init(USART1,&USART_InitSturct);   //初始化串口

        /***********************USART1 NVIC中断配置*************************/
        NVIC_InitSturct.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitSturct.NVIC_IRQChannelCmd = ENABLE;    //IRQn通道使能
        NVIC_InitSturct.NVIC_IRQChannelPreemptionPriority = 3;  //抢占优先级
        NVIC_InitSturct.NVIC_IRQChannelSubPriority = 3; //子优先级3
        NVIC_Init(&NVIC_InitSturct);

        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    //开启接收数据中断
        USART_Cmd(USART1,ENABLE);   //使能串口
                    
    }


   //++++++++++++++++++++++++++++++++++++++++++++++++++
    //串口 TX(PA9),RX(PA10)
    void USART1_IRQHandler(void)
    {
       u8 res;
       if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)    //串口接收到中断,即读取串口接受的数据
       {
                                   PCout(13) = 0;
           res = USART_ReceiveData(USART1);    //读取接收到的数据
                                   USART_SendData(USART1,res);
                                 
       }
    }


int main(void)
    {
              In_Working();
              HC595_Init();
              HC595_SendData(0x00);// all to 0
              HC595_USART_Init();        
              NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
              //printf("22222222222222222222222222222222");
                    while (1)
                    {
                            //+++++++++++++++++++++++++++++++++
                            PCout(13) = 0;
                            Delay(0xffff);
                            PCout(13) = 1;
                            Delay(0xffff);
                            //+++++++++++++++++++++++++++++++++
                           
                            //Usart_SendByte( USART1, 'A' );
                            //Usart_SendString(USART1,"SASDASD");
                           
                    }                        
    }

1.png (139.63 KB, 下载次数: 117)

图1

图1

2.png (144.09 KB, 下载次数: 67)

图2

图2
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:262 发表于 2022-12-2 22:10 | 只看该作者
极有可能是第一个字符未发送成功  切换成hex模式看看
回复

使用道具 举报

板凳
ID:384109 发表于 2022-12-2 22:43 | 只看该作者
代码不全,没有看到设置波特率
回复

使用道具 举报

地板
ID:1055365 发表于 2022-12-3 13:54 | 只看该作者
要不先换一个输出调试一下看看
回复

使用道具 举报

5#
ID:593706 发表于 2022-12-3 21:19 | 只看该作者
这个问题根本就不是晶振的问题。问题应该出在串口通信的“字符超时和回复超时”,发送的时候在建立串口通信的初期,要适当延时一会,每个字节之间也要按规定进行延时,这种问题的表现就是前边的字符不正常,后边的正常,因为前边还没有建立稳定的通信,后面通信建立稳定了,就正常了。
回复

使用道具 举报

6#
ID:593706 发表于 2022-12-3 21:21 | 只看该作者
如果使用成品的PLC进行串口通信,字符超时和回复超设置不正确,也会出现收发字符不一样的现象。
回复

使用道具 举报

7#
ID:1055392 发表于 2022-12-4 08:20 来自手机 | 只看该作者
初始化前先清除发送完成标志
回复

使用道具 举报

8#
ID:830151 发表于 2022-12-5 14:18 | 只看该作者
heicad 发表于 2022-12-2 22:10
极有可能是第一个字符未发送成功  切换成hex模式看看

hex模式也是一样,前面的不一样,后面的一样
回复

使用道具 举报

9#
ID:830151 发表于 2022-12-5 14:18 | 只看该作者
人中狼 发表于 2022-12-2 22:43
代码不全,没有看到设置波特率

在define定义了
回复

使用道具 举报

10#
ID:830151 发表于 2022-12-5 14:19 | 只看该作者
SouKaQiMa 发表于 2022-12-4 08:20
初始化前先清除发送完成标志

我试试看看
回复

使用道具 举报

11#
ID:830151 发表于 2022-12-5 14:20 | 只看该作者
lsgzq 发表于 2022-12-3 21:19
这个问题根本就不是晶振的问题。问题应该出在串口通信的“字符超时和回复超时”,发送的时候在建立串口通信 ...

我试试看,感谢
回复

使用道具 举报

12#
ID:830151 发表于 2022-12-5 14:20 | 只看该作者
lsgzq 发表于 2022-12-3 21:21
如果使用成品的PLC进行串口通信,字符超时和回复超设置不正确,也会出现收发字符不一样的现象。

我试试看,感谢
回复

使用道具 举报

13#
ID:77589 发表于 2022-12-5 15:25 | 只看该作者
不纠结
肯定是整个系统还没有稳定就开始发数据了。
你试试先延时一段时间后,再通过串口发送。
回复

使用道具 举报

14#
ID:830151 发表于 2022-12-5 16:00 | 只看该作者
Longan.Wang 发表于 2022-12-5 15:25
不纠结
肯定是整个系统还没有稳定就开始发数据了。
你试试先延时一段时间后,再通过串口发送。

已经试过,我看看在加长的时间看看
回复

使用道具 举报

15#
ID:401564 发表于 2022-12-5 21:03 | 只看该作者
多少年都没有用过595了,什么功能都忘记了
一般来说,能直接用单片机控制的,我基本都不去多看数字芯片一眼
STM32更加不用说了
你可以用串口直接发送看一下,串口正常了,再看其它地方的代码
回复

使用道具 举报

16#
ID:830151 发表于 2022-12-7 18:50 | 只看该作者
Y_G_G 发表于 2022-12-5 21:03
多少年都没有用过595了,什么功能都忘记了
一般来说,能直接用单片机控制的,我基本都不去多看数字芯片一眼
...

595这边没啥问题,就是串口通信不太对。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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