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 打赏 收藏 转发到动态 举报
写回复
用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个数,明显是上下位机的波特率不匹配;
把上下位的的波特率改成一致就行了。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧