STM32库函数USART_SendData问题和解决方法

合集下载

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); //A。

stm32-串口实验遇到的问题

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串口发送字符串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后无法运行的解决方法

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调试过程中常见的问题及解决方法

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卡死的解决方案

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重定向及错误解决办法

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_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标志位状态,以确定数据是否成功发送。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 状态检测语句,确保一个字符完全发送出去,才进行下
一个字符的发送。

相关文档
最新文档