我通过串口调试助手发送03020100,但是没有任何反应啊,这是为什么呢?
工程说明:希望通过串口发送一段数字,如输入03 02 01 00,其中03代表指令包长度,02代表指令码,01代表要将LED灯点亮,00表示指令结束
程序如下:
u8 USART_RX_BUF[USART_REC_LEN]; //设置buf,最大长度USART_REC_LEN
//初始化,设置波特率
void uart_init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
USART_DeInit(USART3);
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART3_RX  
B11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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(USART3, &USART_InitStructure);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
USART_Cmd(USART3, ENABLE);
USART_ClearFlag(USART3, USART_FLAG_TC); //防止第一位丢失
}
/******发送一个字符******/
u16 USART_PutChar(u16 ch)
{
USART_SendData(USART3,ch);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET){}//发送完成
return ch;
}
/******接收一个字符*******/
u16 USART_GetChar(void)
{
uint16_t temp;
while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE) == RESET); //接收完成
temp = USART_ReceiveData(USART3);
return temp;
}
/********发送一个字符串***********/
void USART_PutString(u8 *buf, u8 length)
{
int j;
for( j=0; j
{
USART_PutChar(*buf++);
}
}
/*********接收一个字符串**********/
void USART_GetBuf(u8 *buf, u8 length)
{
int i;
for(i=0;i
{
buf= USART_GetChar() && 0x00ff;
}
}
void packed_get(void)
{
while(1)
{
CURRENT_LEN = (uint8_t)USART_GetChar();//第一个字节为命令字节数
USART_GetBuf(USART_RX_BUF,CURRENT_LEN); //将从USART中得到的数据送入USART_RX_BUF中去
if(USART_RX_BUF[CURRENT_LEN-1] == 0)break; //如果得到的数据是00,表示指令结束
}
}
在main函数中:
int main(void)
{
u8 *point = 0;
uart_init(115200); //波特率115200
while(1)
{
packed_get();
point = USART_RX_BUF; //指针指向 USART_RX_BUF,此时指针指向 03 的地址
point++; //使指针指向02的地址
while(1)
{
switch(*point) // 对指令码进行判断
{
case 0x02: //指令码是 02
{
point++; //指向01的地址
if(*point == 1) //如果值为01
{
GPIO_SetBits(GPIOB,GPIO_Pin_13); //点亮LED灯
}
point+=1;
}
case 0x50://如果指令码是50
{
point++; //指向指令码后面的数,其为需要从USART读的数的长度
len = *point; //得到长度
point++; //指向需要从USART读的第一个数的地址
USART_GetBuf(point,len); //再从USART读,这句不对,可是我不知道怎样写
point+=len; //指针往后加
len = 0; //清零
}
break;
case 0x00:
break;
default: break;
}
}
}
}
最后再说明一下,如果我发送的指令是 06 02 01 50 05 0001020304 00,就表示我的整条指令长度06 第一个指令码 02 第一条指令 01 ,第二条指令码50,要读的数的长度 05 要读的数为 0001020304,最后结束指令00.
求站长大大帮帮我,我原来是学生物的,现在慢慢喜欢上电子了。但是基础好差,比如C语言等等,正在学习,谢谢论坛,谢谢站长。