OpenEdv-开源电子网

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

关于stm32串口通信

[复制链接]

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-6-22
在线时间
21 小时
发表于 2018-9-10 21:52:25 | 显示全部楼层 |阅读模式
5金钱
# include <usart.h>
# include <delay.h>
# include <sys.h>
//u16 res=1;
int main (void)
{
        uart_init (115200);
        while (1)
                {
                               
         USART1->SR;
        USART_SendData(USART1, 1);
   while (USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
                        delay_ms(1000);
                }
}
这个为什么不能输出1,USART_SendData(USART_TypeDef* USARTx, uint16_t Data)这个里面的Date有什么要求吗,可以直接输入汉字吗

最佳答案

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

异步串口一帧的数据位是7,8,9,无法一次性发送16bit的数据,只能分为两个数据帧发,所以没有设计形参为u16这样的发送函数。 如果想发送汉字也是可以的,先发送高字节部分,然后再发送低字节部分,就可以了。 不显示1可能是串口助手没有调成为hex显示模式。 另外建议在发送前判断是否有没有发送完成,然后再调用发送函数。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-10 21:52:26 | 显示全部楼层
异步串口一帧的数据位是7,8,9,无法一次性发送16bit的数据,只能分为两个数据帧发,所以没有设计形参为u16这样的发送函数。
如果想发送汉字也是可以的,先发送高字节部分,然后再发送低字节部分,就可以了。

不显示1可能是串口助手没有调成为hex显示模式。

另外建议在发送前判断是否有没有发送完成,然后再调用发送函数。
十六进制带我飞。
回复

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-6-22
在线时间
21 小时
 楼主| 发表于 2018-9-10 22:25:00 | 显示全部楼层
# include <usart.h> # include <delay.h> # include <sys.h> //u16 res=1;  int main (void) {         uart_init(115200);         while (1)                 {                                           USART1->SR;         USART_SendData(USART1, 'a');    while (USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);                         delay_ms(5);                 } }
回复

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-6-22
在线时间
21 小时
 楼主| 发表于 2018-9-10 22:25:31 | 显示全部楼层
改成这样就没有显示了,为什么啊
回复

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-6-22
在线时间
21 小时
 楼主| 发表于 2018-9-10 22:26:37 | 显示全部楼层
sfy 发表于 2018-9-10 22:25
改成这样就没有显示了,为什么啊

# include <usart.h>
# include <delay.h>
# include <sys.h>
//u16 res=1;

int main (void)
{
        uart_init(115200);
        while (1)
                {
                               
         USART1->SR;
        USART_SendData(USART1, 'a');
   while (USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
                        delay_ms(5);
                }
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-11 01:59:49 | 显示全部楼层
仿真找问题
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2018-9-11 10:08:11 | 显示全部楼层
你把1改成0x01就可以了。原因我就不知道了。
自己选择的路,成家前走完。
回复

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-6-22
在线时间
21 小时
 楼主| 发表于 2018-9-12 11:07:34 | 显示全部楼层
DreamWaterPro 发表于 2018-9-11 08:14
异步串口一帧的数据位是7,8,9,无法一次性发送16bit的数据,只能分为两个数据帧发,所以没有设计形参为u1 ...

那如果是汉字的话怎么转化成高低字节,两者之间怎么对应的
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-12 22:18:55 | 显示全部楼层
sfy 发表于 2018-9-12 11:07
那如果是汉字的话怎么转化成高低字节,两者之间怎么对应的

对应的关系不需要你管,这个对应关系由字符集GB2312决定。

关于转换:如果对于u16型数据ccc,那么ccc&0x00ff表示其低字节部分,(ccc&0xff00>>8)表示其高字节部分。

但是楼主应该是要问怎么样才能够在串口上显示汉字,通过直接调用函数的方式。如果只是考虑串口发送的话这个问题非常简单:

[mw_shl_code=c,true]u8 str[64]="你好,这里是测试文本";

...

u8 len=strlen(str);

for(i=0;i<len;i++)
{
        //伪代码
        USART_SendData(USART1,str);
}[/mw_shl_code]
十六进制带我飞。
回复

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-6-22
在线时间
21 小时
 楼主| 发表于 2018-9-17 16:38:58 | 显示全部楼层
DreamWaterPro 发表于 2018-9-12 22:18
对应的关系不需要你管,这个对应关系由字符集GB2312决定。

关于转换:如果对于u16型数据ccc,那么ccc&0 ...

这个只能通过数组来输出汉字或数字吗
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-17 19:03:50 | 显示全部楼层
sfy 发表于 2018-9-17 16:38
这个只能通过数组来输出汉字或数字吗

只要符合上位机软件的字符集,显示什么文字符号都可以。

一般地市支持ASCII码以及GB2312字符集。
十六进制带我飞。
回复

使用道具 举报

19

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2018-6-22
在线时间
21 小时
 楼主| 发表于 2018-9-19 21:26:34 | 显示全部楼层
DreamWaterPro 发表于 2018-9-17 19:03
只要符合上位机软件的字符集,显示什么文字符号都可以。

一般地市支持ASCII码以及GB2312字符集。

为什么我的程序是这样的会一直输出a啊
# include <usart.h>
# include <delay.h>
# include <sys.h>
# include <stm32f10x.h>
u16 res='a';
int main ()
{
   

        uart_init(115200);
        USART_SendData(USART1, res);
   while (USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
   
                       
}
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-20 08:44:31 | 显示全部楼层
sfy 发表于 2018-9-19 21:26
为什么我的程序是这样的会一直输出a啊
# include
# include

USART_SendData()这个函数原型中,规定的第二个参数是u8类型吧,这样即使你送给它一个u16型的数据,它也只是截断高字节部分,只是取其低字节部分,所以显示的时候只有'a'。
但是就算是它不截取低字节部分,直接显示的话是“\0a”,而'\0'是不可显示字符,所以显示出来也还是只有一个字符'a'
十六进制带我飞。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 01:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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