初级会员

- 积分
- 103
- 金钱
- 103
- 注册时间
- 2017-6-2
- 在线时间
- 18 小时
|
6金钱
1、我做的是数传模块跟32通信,模块的串口通信协议是AT指令格式的,所以我把要发送的命令都转成十六进制存放到数组里,以下是其中一条命令,命令以回车换行结束:
unsigned char CMD1[15]={0x41,0x54,0x2B,0x44,0x4D,0x4F,0x43,0x4F,0x4E,0x4E,0x45,0x43,0x54,0x0D,0x0A}; //AT+DMOCONNECT
2、关于printf函数重定向部分:这部分完全参照正点原子的例程,没使用MicroLIB库,就是重定向fputc函数。
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif
3、在main.c中,printf函数打印到串口我是这么写的:
printf("AT+DMOCONNECT\r\n");
USART_OUT(USART2, CMD1,15);
USART_OUT函数我在usart.c中是这样定义的:
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,uint16_t Len){
uint16_t i;
for(i=0; i<Len; i++){
USART_SendData(USARTx, Data); //发送一个字节数据
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);//判断是否发送完毕,RESET定义为0
}
}
4、模块和32之间用串口2连接。在main.c中对接收数据处理部分的代码如下,蓝色部分代码意思是一行行显示:
while(1)
{
if(USART_RX_STA2&0x8000)
{
OLED_Clear(); //清一次屏
USART_Data_num=USART_RX_STA2&0x3FFF; //USART_Data_num为串口接收数据数量
USART_OUT(USART2, USART_RX_BUF2,USART_Data_num);
USART_RX_STA2=0;//清接收状态标志位
for(i=0;i<USART_Data_num;i++)
{
if(i<16)
{
OLED_ShowChar(i*8,0,USART_RX_BUF2);
}
else if(i>=16 && i<32)
{
OLED_ShowChar((i-16)*8,2,USART_RX_BUF2);
}
else if(i>=32 && i<48)
{
OLED_ShowChar((i-32)*8,4,USART_RX_BUF2);
}
else if(i>=48 && i<64)
{
OLED_ShowChar((i-48)*8,6,USART_RX_BUF2);
}
else
{;}
}
}
else
{;}
}
}
5、那么问题来了!!!红色部分代码i=0,即从A开始显示,理论上应该会显示“AT+DMOCONNECT”,可结果我是从T开始,显示的是“T+DMOCONNECT”,缺了A,现在找不出代码哪里有问题,希望大神们帮着给看看。
|
最佳答案
查看完整内容[请看2#楼]
已解决问题。
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,uint16_t Len){
uint16_t i;
for(i=0; i
|