OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4278|回复: 2

关于stm32串口的一些疑问

[复制链接]

8

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-3-19
在线时间
7 小时
发表于 2015-6-3 22:13:21 | 显示全部楼层 |阅读模式
5金钱
请问原子哥,我利用串口发送数据点亮开发板的led灯的时候,发送+LED1 ON控制灯亮,发送+LED1 OFF控制灯灭,利用strcmp函数来处理字符串的比较,但是只能控制一次灯的亮灭,之后无论串口怎么发数据灯都没有任何反应,个人感觉是strcmp函数出了问题,于是自己写了一个字符串比较函数,结果程序运行正常。但是又不知道之前#include<string.h>中的strcmp函数为什么就不能用,麻烦原子哥指点一下!!

下面是程序
[mw_shl_code=c,true]int str_cmp(char*p1,char*p2)//自己写的字符串比较函数 { while(p1!=NULL && p2 != NULL) { while(*p1 == *p2 && *p1 != '\0' && *p2 != '\0') { p1++; p2++; } return *p1 - *p2; } return 0; } int main() { u8 t; u8 len; u16 times=0; delay_init(); NVIC_Configuration(); uart_init(9600); led_init(); while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff; printf("\r\n您发送的消息为:\r\n\r\n"); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } USART_RX_BUF[len]=0; if(len==9||len==8) { if(str_cmp(USART_RX_BUF,"+LED1 ON")==0)led2=0; if(str_cmp(USART_RX_BUF,"+LED1 OFF")==0)led2=1; } USART_RX_STA=0; }else { times++; if(times%30==0)led1=!led1; delay_ms(10); } } }[/mw_shl_code] [mw_shl_code=c,true]
[mw_shl_code=c,true]void uart_init(u32 bound){ //GPIO?????è?? GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //????USART1??GPIOA?±?? //USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //???????ì???? GPIO_Init(GPIOA, &GPIO_InitStructure); //USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//???????? GPIO_Init(GPIOA, &GPIO_InitStructure); //Usart1 NVIC ???? NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//??????????3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×???????3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨?????? NVIC_Init(&NVIC_InitStructure); //?ù?????¨????????????VIC?????÷ //USART ???????è?? USART_InitStructure.USART_BaudRate = bound;//??°??è????9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×??¤??8?????????? 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(USART1, &USART_InitStructure); //???????®?? USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//???????? USART_Cmd(USART1, ENABLE); //?????®?? TIM4_Init(99,7199); USART_RX_STA=0; TIM4_Set(0); } void TIM4_Set(u8 sta) { if(sta) { TIM_SetCounter(TIM4,0);//?????÷???? TIM_Cmd(TIM4, ENABLE); //????TIMx }else TIM_Cmd(TIM4, DISABLE);//??±??¨?±?÷4 } void TIM4_Init(u16 arr,u16 psc) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //?±??????//TIM4?±?????? //?¨?±?÷TIM3?????? TIM_TimeBaseStructure.TIM_Period = arr; //?è???????????ü??????×°????????×?????×°???????÷???????? TIM_TimeBaseStructure.TIM_Prescaler =psc; //?è??????×÷??TIMx?±?????????????¤·????? TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //?è???±??·???:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM?ò?????????? TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //?ù?????¨????????????TIMx???±???ù?????? TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //???????¨??TIM4????,???í?ü?????? NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//??????????3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //×???????3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨?????? NVIC_Init(&NVIC_InitStructure); //?ù?????¨????????????VIC?????÷ } void USART1_IRQHandler(void) //?®??1????·??????ò { u8 res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//?????????? { res =USART_ReceiveData(USART1); if(USART_RX_STA<USART_MAX_RECV_LEN) //?????????????? { TIM_SetCounter(TIM4,0);//?????÷???? if(USART_RX_STA==0)TIM4_Set(1); USART_RX_BUF[USART_RX_STA++]=res; //?????????????? }else { USART_RX_STA|=1<<15; //????±ê???????ê?? } } } void TIM4_IRQHandler(void) { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//???ü?????? { USART_RX_STA|=1<<15; //±ê???????ê?? TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //????TIMx?ü??????±ê?? TIM4_Set(0); //??±?TIM4 } } [/mw_shl_code]


[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-3 23:48:57 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-6-5 18:05:45 | 显示全部楼层
沒看到你宣告USART_RX_BUF部分
USART_RX_BUF 沒看你有去做清除資料的動作

我個人猜測
strcmp 不行是因為他是建立一個指標的副本 再進行比對 
你重複一次之後 沒清除USART_RX_BUF 他會一直比對到先前發送過的

if(str_cmp(USART_RX_BUF,"+LED1 OFF")==0)led2=1;
這一行會一直成立
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-28 23:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表