OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2380|回复: 18

串口通信问题。。。

[复制链接]

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-6-22 14:39:26 | 显示全部楼层 |阅读模式
20金钱
最后问一次了,实在没办法,敬请海涵!
使用板一的串口一接收来自板二发来的数据(板二程序未知,只知道串口设置),板一串口一与板二串口设置一样。然后通过板一的串口二发出串口一接收到的数据,并在串口助手上显示。

因为板二发来的数据类型和长度和发送的时间间隔都未知,所以我在串口一中断函数里每接收到一个字节数据,就通过串口二发出来(这里程序我单独用串口二试过,在串口二中断函数里每接收一个字节,就通过串口二发出,串口助手显示正常,发送过快会可能导致部分数据丢失,但没有乱码)。测试结果是串口打印完全乱码

串口二程序单独测试没有问题,程序就不发出来了。

//串口一初始化配置
void Usart1_Init(u32 bound)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    // 串口一初始化复位
    USART_DeInit(USART1);

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;        
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;      
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         
    NVIC_Init(&NVIC_InitStructure);   

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           //PA9 TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;              //PA10 RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //上拉模式
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = bound;                 
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
    USART_InitStructure.USART_StopBits = USART_StopBits_1;      
    USART_InitStructure.USART_Parity = USART_Parity_No;         
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  
    USART_Init(USART1, &USART_InitStructure);                        


    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);           //使能接收

    USART_Cmd(USART1, ENABLE);                               //′串口一使能
          USART_ClearFlag(USART1, USART_FLAG_TC);      //清除发送完成标志            
}

void USART1_IRQHandler()
{
        u8 Res;

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
        {
                Res = USART_ReceiveData(USART1);        
                USART_SendData(USART2,Res);
        }
}      

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //中断分组

        LED_Init();                                                                          //PB8、PB9

        Usart2_init(2400);                                                            //PA2、PA3
        Usart1_Init(9600);                                                            //PA9、PA10


        LED1_ON;LED2_ON;
        while(1)        {; }
}         

在两块板子硬件和硬件连接没问题的情况下,什么会导致乱码?程序有没有问题
我用的是STM32F103ZET6,外部晶振8MHz


最佳答案

查看完整内容[请看2#楼]

板二的数据类型、长度都未知……你怎么确定不是板二本身发送的“乱码”呢? 既然接收到了“乱码”,应该是有数据接收的,直接仿真一下接收到的数据是什么吧。 所谓“乱码”,只不过是因为格式不匹配造成的,例如对方发送的二进制数据,你当成字符处理
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 16:56:24 | 显示全部楼层
它的串口加了DMA,我以前没用到过,正在学习中,谢谢各位的帮助
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-22 14:39:27 | 显示全部楼层
板二的数据类型、长度都未知……你怎么确定不是板二本身发送的“乱码”呢?
既然接收到了“乱码”,应该是有数据接收的,直接仿真一下接收到的数据是什么吧。
所谓“乱码”,只不过是因为格式不匹配造成的,例如对方发送的二进制数据,你当成字符处理
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 14:44:06 | 显示全部楼层

这是串口一,我配置RX为上拉输入,因为串口一没有接232芯片,没有单独测试串口一程序
QQ图片20180622110024.png
回复

使用道具 举报

0

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2017-6-2
在线时间
192 小时
发表于 2018-6-22 15:00:26 | 显示全部楼层
你为什么不试试板二直接接电脑呢?

另外你们现在都是一批被printf惯坏的,串口通讯本质就是一个字节一个字节的数据,一般串口助手我都开16进制显示。

谁告诉你的串口发出来的数据一定是ascii码的,一定能显示出字符的。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 15:01:46 | 显示全部楼层
kvdong 发表于 2018-6-22 14:49
板二的数据类型、长度都未知……你怎么确定不是板二本身发送的“乱码”呢?
既然接收到了“乱码”,应该是 ...

板二发送乱码这个可以排除
与板二连接的时候,是别的电源给两块板子供电,不能在电脑上调试
我一直都是串口发的是字符,以二进制形式发送。能跟我说说怎么发的是二进制数据吗?
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 15:26:39 | 显示全部楼层
jkd405 发表于 2018-6-22 15:00
你为什么不试试板二直接接电脑呢?

另外你们现在都是一批被printf惯坏的,串口通讯本质就是一个字节一个 ...

1.板二那个串口也没接232芯片,就是用来和板一通讯用的,直接接电脑没用

2.是一次一个字节啊,循环一下就可以发送多个了嘛
void USART1_Printf(u8 *String)
{
  while((*String) != '\0')
  {
    Uart1_SendData8(*String);
    String++;
  }
}
printf只能定义一个串口,一般我都是用这个函数

3.求解
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-22 16:01:02 | 显示全部楼层
qiuzhicheng 发表于 2018-6-22 15:01
板二发送乱码这个可以排除
与板二连接的时候,是别的电源给两块板子供电,不能在电脑上调试
我一直都是 ...

可以认为计算机所有的数据都是二进制数据,但是人们读写不方便,所以做了一些转码,比如ASIIC码。比如一个16进制的3(对应二进制11),在ASIIC码里面可能就是你“感觉”到的乱码了。再比如你在ASIIC码里面看到的数字“1”,其实是16进制的0x31。先仿真一下看看接收的值是什么,再分析吧。
PS:在做单片机项目的时候,除非直接面对显示,否则还是用16进制(二进制)方便,也要习惯用。
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-6-22 16:01:32 | 显示全部楼层
建议你先买上这两种模块再去调程序,一个是USB转232接口的可以直接和电路板上的232芯片连。一个是USB转TTL接口的,可以直接和单片机的IO口连。单片机直接和电脑通信调试。各个模块程序测试都没问题了在去组合测试。
usb转232.jpg
USB转TTL.jpg
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-22 16:03:36 | 显示全部楼层
qiuzhicheng 发表于 2018-6-22 15:01
板二发送乱码这个可以排除
与板二连接的时候,是别的电源给两块板子供电,不能在电脑上调试
我一直都是 ...

也就是说,如果你用16进制的角度看的话,所有的值都是在0-255之间的某个确定的数字。而用ASIIC码看,也许“%……&*¥#”就是你所谓的乱码了,但它们也都是实实在在的数值。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 16:30:00 | 显示全部楼层
HXYDJ 发表于 2018-6-22 16:01
建议你先买上这两种模块再去调程序,一个是USB转232接口的可以直接和电路板上的232芯片连。一个是USB转TTL ...

usb转232一直用的是这个
正想买一个usb转ttl
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 16:34:26 | 显示全部楼层
kvdong 发表于 2018-6-22 16:01
可以认为计算机所有的数据都是二进制数据,但是人们读写不方便,所以做了一些转码,比如ASIIC码。比如一 ...

我会好好学一下仿真的
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 16:36:10 | 显示全部楼层
kvdong 发表于 2018-6-22 16:03
也就是说,如果你用16进制的角度看的话,所有的值都是在0-255之间的某个确定的数字。而用ASIIC码看,也许 ...

我是认为没有意义的字符组合,就是乱码。尽管他可以转换成16进制,那也是没有意义的16进制数据
回复

使用道具 举报

0

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2017-6-2
在线时间
192 小时
发表于 2018-6-22 16:36:10 | 显示全部楼层
qiuzhicheng 发表于 2018-6-22 15:26
1.板二那个串口也没接232芯片,就是用来和板一通讯用的,直接接电脑没用

2.是一次一个字节啊,循环一 ...

kvdong已经说的很明确了,就是7#楼的那个答案。

我不知道你是不是看到我说的十六进制显示了,反正这个动作就是鼠标点一下的事

我不知道你为什么不试一下。尤其现在还有其它人提出这个问题。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 16:49:39 | 显示全部楼层
jkd405 发表于 2018-6-22 16:36
kvdong已经说的很明确了,就是7#楼的那个答案。

我不知道你是不是看到我说的十六进制显示了,反正这个 ...

好吧,串口助手显示乱码,让它按16进制显示就会有意义吗
回复

使用道具 举报

14

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
386
金钱
386
注册时间
2016-9-5
在线时间
66 小时
发表于 2018-6-22 16:57:03 | 显示全部楼层
这种问题仿真最能快速解决,串口助手用十六进制显示看看具体的值是多少,然后仿真对照看一下值对不对,还有,直接导致乱码的原因无非就是线接反,波特率不对应这些问题,一个一个的排除吧
回复

使用道具 举报

0

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2017-6-2
在线时间
192 小时
发表于 2018-6-22 16:58:13 | 显示全部楼层
qiuzhicheng 发表于 2018-6-22 16:49
好吧,串口助手显示乱码,让它按16进制显示就会有意义吗

串口通讯本身传的就是数值啊,你让他有意义他就有意义。

你这里本质问题不是不显示,而是你没有板二的通讯协议,所以不知道这些数据的意义。

而不是他真的没有意义。

其实实际应用场合直接十六进制传输的协议很多。

很简单的道理一个字节用来传输十六进制可以表示0-255,两个字节可以表示0-65535,C语言数据类型你肯定了解吧。

但是用ascii码每一位占一个字节。

所以实际应用场合用原始数值通讯的很多。

当然ascii也有好处,就是可以在任意串口助手类型的软件上应用,而不需要特定的上位机。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 16:58:15 | 显示全部楼层
梨落繁华心 发表于 2018-6-22 16:57
这种问题仿真最能快速解决,串口助手用十六进制显示看看具体的值是多少,然后仿真对照看一下值对不对,还有 ...

嗯,谢谢
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-22 17:00:09 | 显示全部楼层
jkd405 发表于 2018-6-22 16:58
串口通讯本身传的就是数值啊,你让他有意义他就有意义。

你这里本质问题不是不显示,而是你没有板二的 ...

谢谢,学习了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 05:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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