使用STM32F103VC控制器,使用串口2,9600波特率,使用2.03库,程序很简单,用串口把一个数组顺序发出去,
//和上位机通信
void uart2_send_byte(u8 ch)
{
USART_SendData(USART2, ch);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
{
}
}
但是碰到一个怪现象,第一个字符实“:”(0x24)际上控制器没有发出去,因为上位机接收软件没有收到,这是程序代码:
uart2_send_buf[0] = ':'; //组织缓冲区
uart2_send_buf[1] = slave_addr[0]; //下位机地址
uart2_send_buf[2] = slave_addr[1];
uart2_send_buf[3] = uart2_receive_buf[3]; //功能码
uart2_send_buf[4] = uart2_receive_buf[4];
uart2_send_buf[5] = uart2_receive_buf[9]; //数据长度
uart2_send_buf[6] = uart2_receive_buf[10];
uart2_send_buf[7] = uart2_receive_buf[11];
uart2_send_buf[8] = uart2_receive_buf[12];
省略一些赋值代码
for(ii=0;ii<len;ii++)
uart2_send_byte(uart2_send_buf[ii]);
但是,为解决这个问题,首先让串口发送一个无关数据,如发一个0x00,则后续数组能完整地发送出去,上位机软件显示并没有收到第一个0x00,如下代码:
uart2_send_byte(0x00);
uart2_send_buf[0] = ':'; //组织缓冲区
uart2_send_buf[1] = slave_addr[0]; //下位机地址
uart2_send_buf[2] = slave_addr[1];
uart2_send_buf[3] = uart2_receive_buf[3]; //功能码
uart2_send_buf[4] = uart2_receive_buf[4];
uart2_send_buf[5] = uart2_receive_buf[9]; //数据长度
uart2_send_buf[6] = uart2_receive_buf[10];
uart2_send_buf[7] = uart2_receive_buf[11];
uart2_send_buf[8] = uart2_receive_buf[12];
省略一些赋值代码
for(ii=0;ii<len;ii++)
uart2_send_byte(uart2_send_buf[ii]);
不知道这是什么原因,以前碰见过这个问题,后来现象没有出现,今天这个结果必然出现,请高手指教,这是什么原因导致的,解决方法如何?谢谢!
我也遇到这个类似的问题了
程序已进入while(1)的时候,不能立刻发送,需等候1s左右后就可正常发送。
还没找到原因
郁闷中ing
这种情况大多是焊错了晶振,系统时钟倍频设计错误,或者是波特率设置错误。
汇报一下调试经过
程序中有段代码,每次发送必然出现丢失第一个字节的现象:
阶段1:将判断发送完成标志由TC改成TXE,当时好像解决问题了,可是过了会儿又不行了,郁闷,改回TC;
阶段2:跟踪单步,发现读取USART_SR寄存器并不能清楚TC标志,于是乎在每次USART_SendData前增加一条写SR寄存器语句,我调试的代码处发送正常了,可是程序中其它同类代码有得还是丢,继续郁闷中;
疑问:
1.我用的ST库uart.c版本是0.3,2007年的,不知有没有bug;
2.不会是硬件有问题吧?
3.想升级版本库试试,哎,目前没有思路,全是死描碰瞎耗子!迷惑之处在于此故障不稳定,有时出现,有时不出现。
我还试验了一种方法,9600波特率,写senddata后等待2ms,清TC,再发,不能解决问题,理论上等2ms肯定已经发完了。但是以上每种方法:为什么只是丢第一个字节了。如果在被发送字符前发送一个0x00空字符,有的时候又多数,不好处理!
找到一种特定的情形:
发送5个数正常;
发送10个数,第一个数就丢失,两次发送是同一个函数,把该注释的都注释了。
中断发送方式也失败了,也是不稳定,第一个数时丢时不丢
示波器才是硬道理。别光看上位机有没有接收到。用示波器看引脚有没有发送出去。
手头没有示波器,示波器能捕捉到短暂的一个字符串,并解析是什么字符吗?我曾怀疑过力特的USB to 232线,接在台式计算机串口上,现象一样,上位机接收软件也换了好几个,果真做到了怀疑一切的地步。
使用英蓓特STM32V100-II开发板,ST的STM32F10x_StdPeriph_Lib_V3.3.0例程仍然出现串口发送第一个数丢失现象
现象:程序复位启动,第一个数据发不出去,丢失。
(1)USB转串口、计算机硬件串口都试了,不是串口接收的事
(2)自己做的板子使用103VC和英蓓特的STM32V100-II开发板开发板都一样,启动后第一次发送丢数。
(2)程序在9600和115200波特率下都丢
(4)程序在MDK模拟环境下都正常
程序可是st的官方程序,只是在发送上,为清楚地看出现象,稍加改动,实在不清楚是哪里出了问题。
附件为程序代码,敬请批评指正。anyuan_cpu为测试工程设置,是原来的STM32F10B-eval
RE: 怪现象?串口发送丢数,快跳楼了!
我的程序代码
-
-
CPU_V3.3.rar (862.02 KB)
换过高精度8.000MHz晶振,未能解决问题,哎!!
现在使用103VC,换个101试试,看是否用错了系列!
手头没有示波器,示波器能捕捉到短暂的一个字符串,并解析是什么字符吗?我曾怀疑过力特的USB to 232线,接在台式计算机串口上,现象一样,上位机接收软件也换了好几个,果真做到了怀疑一切的地步。 ...
数字存储示波器可以单次采样,抓到开始变化的波形,自己根据起始位、停止位就能分析出发送的数据。