社区
单片机/工控
帖子详情
stm32f107 串口发送16进制问题
tr10064471
2011-09-05 08:09:42
库函数里的发送函数是void USART_SendData ( USART_TypeDef * USARTx, uint16_t Data ),我要发送一个8位的16进制数0x0E,用USART_SendData ( USART1, 0x0E )发送,接收到的数为什么不是0x0E,而且若循环发送5个8进制数据的话,接收到的只有3个数,这3个数和我发送的数也不一样,感觉应该是波特率或者时钟设计上的问题,不知怎么差错,请知道原因的各位高手指点,不胜感激!
...全文
2027
12
打赏
收藏
stm32f107 串口发送16进制问题
库函数里的发送函数是void USART_SendData ( USART_TypeDef * USARTx, uint16_t Data ),我要发送一个8位的16进制数0x0E,用USART_SendData ( USART1, 0x0E )发送,接收到的数为什么不是0x0E,而且若循环发送5个8进制数据的话,接收到的只有3个数,这3个数和我发送的数也不一样,感觉应该是波特率或者时钟设计上的问题,不知怎么差错,请知道原因的各位高手指点,不胜感激!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
woshi_ziyu
2011-09-09
打赏
举报
回复
[Quote=引用 11 楼 kofbee 的回复:]
波特率设置和时钟似乎关系不大,你参考一下我的代码,肯定没有问题的。与CPU频率也没有关系吧,反正我把CPU设置成24M可以运行,72M也可以运行。
//使能串口1,PA,AFIO总线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_AFIO |
RCC_AP……
[/Quote]
++++
bee
2011-09-09
打赏
举报
回复
波特率设置和时钟似乎关系不大,你参考一下我的代码,肯定没有问题的。与CPU频率也没有关系吧,反正我把CPU设置成24M可以运行,72M也可以运行。
//使能串口1,PA,AFIO总线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_AFIO |
RCC_APB2Periph_USART1 ,
ENABLE);
/* A9 USART1_Tx */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出-TX
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* A10 USART1_Rx */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
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_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_Init(USART1, &USART_InitStructure);
/* Enable the USARTx */
USART_Cmd(USART1, ENABLE);
//串口1使用接收中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
M9D80
2011-09-09
打赏
举报
回复
看函数RCC_Configuration(),在固件库的"stm32f10x_rcc.c"文件
一般都是用HSI或HSE PLL到36M或72M,
或者你研究固件库里的串口例程。很详细的
tr10064471
2011-09-09
打赏
举报
回复
非常感谢各位大侠的回复,程序是这样的,先发送一位16进制0x0E,在接受6个16进制数,再把这6个16进制数发送出去,在stm32x.h里把HSI_VALUE和HSE_VALUE改了不正确。请问怎么知道系统用的是哪个时钟,谢谢!
USART_SendData(USART1,0x0E );
/* Loop until USARTy DR register is empty */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}
while(RxCounter < 6)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
{
}
/* Store the received byte in RxBuffer */
RxBuffer[RxCounter++] = (USART_ReceiveData(USART1));
}
RxCounter=0;
while(RxCounter < TxBufferSize)
{
USART_SendData(USART1, RxBuffer[RxCounter++]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}
}
M9D80
2011-09-07
打赏
举报
回复
注意是不是发完一个字节再发第二个字节的?
检查TC标志或缓冲区空标志
ad0088
2011-09-06
打赏
举报
回复
学习学习
dontium
2011-09-06
打赏
举报
回复
[Quote=引用 1 楼 bjtea 的回复:]
上位机可以用串口调试助手收发数据;
5个数变3个数,明显是上下位机的波特率不匹配;
把上下位的的波特率改成一致就行了。
[/Quote]
能收到数据,说明程序基本正确。把接收与发送的波特率改一致就行
lr2131
2011-09-06
打赏
举报
回复
路过,学习了。不过“为什么波特率非要是二倍关系!”还真不知道是怎么回事,要么是上位机的时钟降为原来的一半,这个不太可能,要么是下位机改了2倍频率的晶振或是倍了2倍频或是怎么样最终给串口的时钟变成了原来的2倍。再不就是这个串口调试程序中说是19200,其实又2分频了。真乱......
tr10064471
2011-09-06
打赏
举报
回复
原来有奇偶校验,去掉后,改为8b。再把下位机波特率设为9600,上位机串口调试程序设计为19200后,数据接收和发送都没有错误,不知道为什么波特率非要是二倍关系!
bee
2011-09-06
打赏
举报
回复
这个应该是stm32软件串口设置的问题。偶校验要设置为:9b, 无校验要设置为:8b,如果波特率都一致的话。
tr10064471
2011-09-06
打赏
举报
回复
非常感谢大家的回复,下位机波特率如果和上位机一样的话(都是19200),接收到的数据就会变少,发9个数只收到5个,而且根本不是我发的数。
如果下位机改为9600,上位机还是19200的话,发送(0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09)的话能接收到九个数(81,82,03,84,85,86,07,08,89),高位不知怎么会有8,而写上位机的波特率是下位机两倍才会受到9个数,波特率如相等的话还收不到9个数,不知为何!我感觉USART_SendData ( USART_TypeDef * USARTx, uint16_t Data )函数发送的应该是16位的数,但这样USART_SendData ( USART1, 0x000E )结果还是这样,郁闷,不知为何!
bjtea
2011-09-05
打赏
举报
回复
上位机可以用串口调试助手收发数据;
5个数变3个数,明显是上下位机的波特率不匹配;
把上下位的的波特率改成一致就行了。
STM32
—USART
串口
发送
+接收
STM32
——USART
串口
发送
+接收
STM32
标准库学习笔记-10.USART
串口
通信接口是不同设备或系统之间进行通信时使用的物理连接和电气特性的规范。它定义了数据的传输方式、信号的传输速率、传输距离和电气标准等。通信接口允许设备之间交换信息和进行数据传输。
STM32
()USART外设,编程
USART1是APB2总线上的设备,另外两个是APB1总线的设备TDR,
发送
移位寄存器,RDR,接收移位寄存器,这四个寄存器在软件层面只有一个DR寄存器可供读写流程
发送
数据时,数据写入TDR寄存器,当
发送
移位数据寄存器为空时,TDR数据移动到移位寄存器,TXE标志位置1,新数据可以写入到TDR中,等
发送
移位寄存器为空时就移动进去双缓冲机制可以保证数据帧之间没有空闲接收数据时,数据从接收移位寄存器移到RDR,RXNE标志位置1,当检测到RXNE为1时,就可以读数据了。
STM32
USART
串口
通信详解:从原理到代码实现
本文深入讲解
STM32
的USART
串口
通信原理与应用,涵盖数据帧结构、硬件机制、HAL库配置、中断与DMA收发、printf重定向、电平标准匹配及RS485组网等关键内容,结合代码实例和常见
问题
解决方案,帮助开发者实现稳定可靠的
串口
通信。
STM32
-RS232
串口
通信(含代码)
在UART通信的时候,一个字节是8位,规定当没有通信信号发生时,通信线路保持高电平,当要
发送
数据之前,先发一位0表示起始位,然后
发送
8位数据位,数据位是先低后高的顺序,数据位发完后再发一位1表示停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到8位数据位后,检测到停止位,再准备下一个数据的接收,如图2所示。(6)接收到规定的数据位个数和校验位后,通信接口电路希望收到停止位S(逻辑1),若此时未收到逻辑1,说明出现了错误,在状态寄存器中置“帧错误”标志。
单片机/工控
27,522
社区成员
28,798
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章