linux 串口突然没反应,求问关于串口的问题,发送的数据一直没有任何反应呀。...

我通过串口调试助手发送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 &nbsp

titter.gifB11

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语言等等,正在学习,谢谢论坛,谢谢站长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值