STM32库函数USART_SendData问题和解决方法
STM32库函数USART_SendData问题和解决方法
1. 问题及现象使用USART_SendData()函数非连续发送单个字符是没有问
题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。
若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。
如:
12for(TxCounter = 0;TxCounter
2. 原因此API 函数不完善,函数体内部没有一个判断一个字符是否发送完毕的语句,而是把数据直接放入发送缓冲区,当连续发送数据时,由于发送移位寄存器的速度限制(与通信波特率有关),导致发送缓冲区的数据溢出,老的数据还未及时发送出去,新的数据又把发送缓冲区的老数据覆盖了。
3. 解决方法发送后等待一段时间延迟的方法就不说了,等待时间不确定,此为下下策。
提供下面2 种方案:
方案1. 在每一个字符发送后检测状态位USART_SendData(USART1, RxBuffer[TxCounter]);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //
等待发送缓冲区空才能发送下一个字符
方案2. 修改库函数修改USART_SendData()函数,在其内部加入发送缓冲区
的USART_FLAG_TXE 状态检测语句,确保一个字符完全发送出去,才进行下
一个字符的发送。
STM32串口第一个字节丢失问题的分析过程
STM32 串口第一个字节丢失问题的分析过程
STM32 串口发送必须先检测状态,否则第一个字节无法发出,发送完
毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x 调试
串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01
0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。
换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06 丢失。
错误依旧。
故障排除过程:
1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工
具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,
不像和电脑软件有关。
2、使用单步调试,单步运行各个发送指令,都正常。
能收到0x01 0x02 0x03 0x04 的数据。
间接的排除了不是电脑软件的问题,而是其他的错误。
3、单步调试运行虽然正常了,但连续运行时,错误依旧。
现在有点摸不到
头绪了,单步运行正常,看起来编程没有出错,那故障在哪里呢?测试程序如
下
USART_SendData(USART2, 0x01); //A。
stm32-串口实验遇到的问题
stm32-串⼝实验遇到的问题
1.Printf函数不能在调试助⼿⾥正常打印?
前提是已经重定向了printf到串⼝,⽽且已经在option⾥勾上了use microlib,⼀切配置都毫⽆问题,在main.c⾥简单printf(“balabala”);却不能在调试助⼿⾥打印出来,点发送也只能发送在调试界⾯输⼊的内容;
2.解决⽅案
(1)将连接电脑的串⼝线,拔⼀下,再插⼀下,点击发送,打印就OK了;
(2)上⾯这种⽅法⽐较笨重,还有⼀种简单的⽅法:直接reset,就会直接答印了;
3.分析
实质上两种⽅法有根本的区别,读者⾃⾏实验判断;由于我是⽤串⼝烧写程序的,在烧写时会关闭调试助⼿的串⼝,等烧写完再打开调试助⼿的串⼝,在这段时间内,⼀条printf打印信息已经被发送完了,但根本没被调试助⼿接收到,所以只要reset⼀下,就会马上打印你想输出的信息了;
4.总结
⼀开始以为是调试助⼿的问题,到处下载其他的调试助⼿,实则结果都⼀样;然后再排查程序的问题(重定向),也没问题;再着查看配置的问题,⽐如引脚的配置,波特率的配置,也都没问题;最后偶然插拔了⼀下usb线就可以了解决问题了;再最后发现reset更为有效。
所以通过以上步骤可以发现,遇到问题,只要⼀⼀排查所有的可能性,最终是会发现答案的。
stm32串口发送字符串STM32串口发送注意问题
stm32串口发送字符串STM32串口发送注意问题导读:就爱阅读网友为您分享以下“STM32串口发送注意问题”资讯,希望对您有所帮助,感谢您对的支持!使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。
换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。
错误依旧。
故障排除过程:1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。
2、使用单步调试,单步运行各个发送指令,都正常。
能收到0x01 0x02 0x03 0x04的数据。
间接的排除了不是电脑软件的问题,而是其他的错误。
3、单步调试运行虽然正常了,但连续运行时,错误依旧。
现在有点摸不到头绪了,单步运行正常,看起来编程没有出错,那故障在哪里呢?测试程序如下USART_SendData(USART2, 0x01); //Awhile(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET); //BUSART_SendData(USART2, 0x02); //Cwhile(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET);USART_SendData(USART2, 0x03);while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET);USART_SendData(USART2, 0x04);while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET);4、猜测,也许是因为某个特殊原因,使第二个数据覆盖了首个数据,使得首个数据丢失。
STM32程序添加printf后无法运行的解决方法
STM32程序添加printf后无法运行的解决方法标准库函数的默认输出设备是显示器,要实现在串口或LCD 输出,必须重定义标准库函数里调用的与输出设备相关的函数.例如:printf 输出到串口,需要将fputc 里面的输出指向串口(重定向),方法如下:#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to Yes) calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__ */ PUTCHAR_PROTOTYPE{/* Place your implementation of fputc here *//* e.g. write a character to the USART */USART_SendData(USART1, (uint8_t) ch);/* Loop until the end of transmission */while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);return ch;}因printf()之类的函数,使用了半主机模式。
使用标准库会导致程序无法运行,以下是解决方法:方法1.使用微库,因为使用微库的话,不会使用半主机模式.方法2.仍然使用标准库,在主程序添加下面代码:#pragmaimport(__use_no_semihosting)_sys_exit(intx){x=x;}struct__FILE{inthandle;/ *Whateveryourequirehere.Iftheonlyfileyouareusingis*//*standardoutputusingprintf()f ordebugging,nofilehandling*//*isrequired.*/};/*FILEistypedefdinstdio.h.*/FILE__std out;tips:感谢大家的阅读,本文由我司收集整编。
STM32调试过程中常见的问题及解决方法
一、在“Debug选项卡”下设置好仿真器的类型后,下载程序时却提示“No ULINK Device found.”解决办法:Keil MDK默认使用ULINK仿真器下载程序,在“Utilities选项卡”下把编程所使用的仿真器改为相应的类型即可。
二、编译工程时提示如下信息:main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10 x_nvic.o).main.axf: Error: L6218E: Undefined symbol __GetBASEPRI (referred from stm32f10x_nvi c.o).main.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK (referred from stm32f 10x_nvic.o).main.axf: Error: L6218E: Undefined symbol __RESETPRIMASK (referred from stm32f10x _nvic.o).main.axf: Error: L6218E: Undefined symbol __SETFAULTMASK (referred from stm32f10x _nvic.o).main.axf: Error: L6218E: Undefined symbol __SETPRIMASK (referred from stm32f10x_n vic.o).解决办法:工程缺少“cortexm3_macro.s”文件,把cortexm3_macro.s和STM3210x.s全部添加到工程即可。
三、调试器不能连接到STM32的问题与解决办法很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。
STM32之HAL库串口USART丢数据及ORE卡死的解决方案
STM32之HAL库串口USART丢数据及ORE卡死的解决方案刚装了VS2019Preview,VS2017系列应该还有最后一章就结束了,找个时间结束掉它。
昨晚弄了下STM32的串口通信,发现UART在接收PC串口调试助手发送的数据的时候,会时不时卡死,不能接收新的数据。
之前公司有人做这方面的项目的时候也是这个情况,当时发现UART处于ORE(overrun error)状态,归结为波特率太高,降低波特率算妥协了。
结果自己弄Nucleo的开发板也出现这个情况,我想STM官方开发板应该不至于只能跑低速通信。
没办法查查吧。
首先把ORE的检测关掉。
这个东西吧,有啥意义呢?Overrun检测是好的,可以告诉系统目前通信超负荷然后进行调整。
但是目前99%以上的开发者都不会管这个东西,另外他们也没有这么极限数据率通信的需求。
如果要检测ORE,你的系统中一定要有UART的Error handler 函数,进行ORE出现时的状态寄存器清理和系统调整。
否则就会出现系统被卡死再也无法通信的情况。
这个ORE的检测是CubeMX默认打开的,在UART的配置里面,如下(我这是5.0CubeMX):代码里面是这两句(我的CubeMX和MDK都是最新版,可能老版本不一样,如果没有就写ErrorHandler进行错误位复位):1.huart2.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE;2.huart2.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR;---------------------------------------------------------2019/6/25 更新--------------------------------------------------------------------试了下STM32F103RC并没有这个OverrunDisable开关,之前还认为是CubeMX更新后带来的新特性。
stm32串口实现printf重定向及错误解决办法
ch=ch;
}
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
//串口1 GPIO_Pin_11,A
//串口2 GPIO_Pin_4,A
//串口3 GPIO_Pin_12,GPIOB
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
} /*.\OUTPUT\STM32_4PMaser.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced*/
_ttywrch(int ch) //可以消除这个错误
/* Loop until the end of transmission */
usart_senddata函数用法
usart_senddata函数用法USART (Universal Synchronous/Asynchronous Receiver/Transmitter) 是一种由微处理器或计算机实现的串行通信接口,用于向外界设备或其他计算机传输数据。
USART可实现异步或同步的串行传输,具有高效性、可靠性和灵活性,因此在许多计算机和嵌入式系统中广泛应用。
USART使用串行通信协议,通过发送和接收数据包,实现设备间的数据交换。
在这里,我们将介绍USART_SendData函数的用法。
USART_SendData函数是STM32微控制器的USART库函数之一,用于在USART通信中向外界设备发送数据。
通常,在发送数据之前,需要初始化USART接口,配置它的各种参数,包括波特率、数据位、停止位和校验位等。
这些参数可以通过STM32芯片上的USART寄存器进行配置。
在配置完成之后,可以使用USART_SendData函数将数据发送到USART接口。
USART_SendData函数的参数有两个,第一个是USART_TypeDef类型的指针,指向USART寄存器组。
USART_TypeDef结构体中包含了USART寄存器的各种寄存器值,包括数据寄存器、状态寄存器和控制寄存器等。
第二个参数是要发送的数据值,为unsigned short类型。
USART_SendData函数的返回值为一个标志位,标志着数据是否成功发送。
如果数据发送成功,返回值为1;如果数据发送失败,返回值为0。
USART_SendData函数的使用非常简单,只需调用函数并传递参数即可发送数据。
以下是USART_SendData函数的示例代码,它将一个8位二进制字节(0x55)发送到USART1接口:USART_SendData(USART1, 0x55);在发送数据之后,通常需要检查发送是否成功。
可以使用USART_GetFlagStatus函数来读取USART标志位状态,以确定数据是否成功发送。
STM32程序无法使用printf,产生停留BEAB BKPT 0xAB处问题的解决
STM32 程序无法使用printf,产生停留BEAB BKPT
0xAB 处问题的解决
在网上搜了下,发现有很多这样的问题,我也遇到了,最后解决了,我在
此总结一下:
问题1(与编译软件无关):在程序中加入printf 语句实现串口输出,但未
写重定向函数fputc,出现编译无任何警号和错误直接下载无法运行,软件仿真
可以运行至MAIN 函数,硬件仿真在汇编窗口看到停留在“0x0800XXXX BEAB BKPT 0xAB //进入调试模式”处无法继续运行。
解决办法:编写fputc 函数如下:
1 int fputc(int ch, FILE *f)
2 {
3 USART_SendData(USART1, (uint8_t) ch);
4 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
5 {}
6 return ch;
7 }
问题2(与编译软件有关):重定向函数fputc 编写无误,使用的是
MDK4.22-3.40 之间的编译环境,未使用微库,即MiclroLIB,因printf()之类的
函数,使用了半主机模式。
使用微库的话,不会使用半主机模式,所以就没有
问题。
解决办法:在option for target->target 对话框中,选择Use MiclroLIB,重新编译程序即可。
问题3:重定向函数fputc 编写无误,不用微库,即MiclroLIB,依然可以使。
stm32 串口数据处理函数
stm32 串口数据处理函数STM32是一种嵌入式微控制器,广泛应用于各种领域,如工业控制、汽车电子、智能家居等。
其中,串口通信是一种常见的数据传输方式,因此对于STM32来说,串口数据处理函数是一个非常重要的部分。
本文将从串口数据处理函数的作用、实现方法及常见问题进行介绍。
一、串口数据处理函数的作用串口数据处理函数主要用于接收和处理通过串口传输的数据。
在STM32中,串口通信一般使用USART模块来实现,其中包括了发送和接收数据的寄存器和中断。
通过串口数据处理函数,可以实现对接收到的数据进行解析、处理和应答。
二、串口数据处理函数的实现方法在STM32中,串口数据处理函数一般通过中断的方式实现。
首先需要配置USART模块的寄存器,设置波特率、数据位、停止位等参数。
接着,使能USART的接收中断,并编写中断服务函数。
当接收到数据时,中断服务函数会被触发,将接收到的数据存储到相应的缓冲区中。
在主程序中,可以通过轮询或者事件驱动的方式对接收到的数据进行处理。
根据具体的需求,可以使用字符串处理函数、数据解析函数等对数据进行处理,并根据处理结果进行相应的操作。
三、串口数据处理函数的常见问题1. 数据丢失:由于串口通信的速度较慢,当数据传输速度过快时,可能会导致数据丢失。
为了避免数据丢失,可以使用DMA(直接存储器访问)来实现串口通信,提高数据传输效率。
2. 数据错误:在数据传输过程中,由于噪声等原因,可能会导致数据出现错误。
为了保证数据的准确性,可以使用校验位来验证数据的完整性。
3. 数据解析困难:当接收到的数据较为复杂时,可能会出现数据解析困难的情况。
为了解决这个问题,可以使用状态机或者正则表达式等方法来进行数据解析。
4. 数据处理效率低:当需要处理大量数据时,可能会导致处理效率低下。
为了提高数据处理效率,可以使用多线程或者硬件加速等方法。
四、总结串口数据处理函数在STM32中起着至关重要的作用,通过合理的配置和编写,可以实现对串口数据的接收和处理。
