不得不说串口是个好东西,协议简单,使用方便.是下位机与上位机通讯一个很好的选择.今天就讲讲在stm32下的串口调试.
开发环境: UBUNTU LINUX 13.10 ARM GCC(具体搭建请见我前面的博客文章)
芯片: stm32f103zet6
库: 官方库
个人原创,版权所以,转载请注明原文出处:
http://www.embbnux.com/2014/03/20/stm32_send_string_on_usart/
一 配置串口,打开串口
初始化程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //初始化 USAR 1 void usart_init( void ){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; //PA 9 作为US 1 的TX端,打开复用,负责发送数据 //GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_ 9 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_ 50 MHz; GPIO_Init(GPIOA , &GPIO_InitStructure); //PA 10 作为US 1 的RX端,负责接收数据 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_ 10 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = BAUD; USART_InitStructure.USART_WordLength = USART_WordLength_ 8 b; 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_Init(USART 1 ,&USART_InitStructure) ; USART_Cmd(USART 1 , ENABLE); } |
使用USART1,主要是配置波特率,GPIO等,记得要打开串口时钟;
二 发送接收数据
发送单字节数据
1 2 3 4 5 6 7 8 | //发送 void usart_transmit( unsigned char data ){ USART_ClearFlag(USART 1 ,USART_FLAG_TC); USART_SendData(USART 1 ,data); while(USART_GetFlagStatus(USART 1 ,USART_FLAG_TC)==RESET); USART_ClearFlag(USART 1 ,USART_FLAG_TC); } |
特别要说一下这里的while等待,这里是等待一个字节发送成功.如果没有这句的话,在连续发送过个字节,也就是字符串的时候,会发生丢失数据.
发送字符串:
1 2 3 4 5 6 7 | void usart_send_string(char *str){ while(*str) { usart_transmit(*str) ; str++; } } |
接收数据:
这里比较简单的配置了一下,其实应该用中断的:
1 2 3 4 5 6 | //接收信息 unsigned char usart_receive( void ){ unsigned char data; data =USART_ReceiveData(USART 1 ); return data; } |
串口配合sprintf使用,可以很好的打印整型数浮点数等,但是在我现在这个环境下用sprintf编译不通过,挺奇怪的,我用avr-gcc倒是好好的.
楼主,问下你在你这个工程上用起sprintf或者是printf了吗?
我现在是编译通过,通过重写_write函数,printf字符串可以,但是printf(“%d”, i)类似这种带%d %s 的输出,程序就卡死了,我想请教下楼主的使用情况,多谢!