社区
单片机/工控
帖子详情
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个数和我发送的数也不一样,感觉应该是波特率或者时钟设计上的问题,不知怎么差错,请知道原因的各位高手指点,不胜感激!
...全文
1189
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
F107
网络升级程序
STM32
F107
芯片,用LWIP实现网络升级,从官方网站的程序更改过来。 进入升级状态:
串口
发送
数据: a0 00 00 0F 00 F1 00 00 00 00 00 00 00 5E AF 使APP重启 通过TFTPD32升级程序 结束升级状态,用网络调试助手创建一个SOCKET客户端,端口号:8998,IP为要升级的主机IP地址,用
16进制
发送
数据: a0a188a2a3
STM32
f107
的 485通讯 源码 (
串口
1)
STM32
f107
的 485通讯 源码 (
串口
1) RE485.H 文件 源码: extern u16 R_m; extern u16 Rm[32]; extern u16 R_n; extern u16 Rn[32]; //模式控制 #define RS485_TX_EN PAout(12) //485模式控制.0,接收;1,
发送
. //如果想
串口
中断接
STM32
—USART
串口
发送
+接收
STM32
——USART
串口
发送
+接收
STM32
F107
VC的ETH以太网外设+DP83848无法
发送
和接收数据包的解决办法
转载自:https://www.itdaan.com/blog/2017/10/14/8f74ff1d3a7ffb59bae43aa29892c659.html 必须根据DP83848的自动协商结果配置ETH_MACCR的DM(duplex mode)和FES(fast ethernet speed)位。 网线上数据
发送
线和接收线是分开的。
发送
用的是白橙(正线)、橙(负线)这对双绞线,而接收用的是白绿(正线)、绿(负线)这对双绞线。 当以太网集线器上只插了两根网线时,一定不会产生碰撞,既可以配置为半双工
STM32
的HAL库开发系列 -
串口
发送
STM32
的HAL库开发系列 -
串口
发送
单片机/工控
27,375
社区成员
28,769
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章