`【uFun试用体验】串口调节RGB灯
使用PWM调RGB灯,但是PWM的参数还的我手动设置,这样每调一次光我都得重新下载程序这样我感觉有点麻烦,在网上找了些案例,有串口和上位机调节PWM的参数进而调光,但是本人是菜鸟一枚,不会做上位机,无奈只能使用串口的方式发送调光数据,串口虽然比不上上位机,也能节省一定的开发时间,PWM调光原理在我另一篇帖子已经有过讲解,这里我就不再详细讲了有兴趣的可以看看
链接:https://bbs.elecfans.com/jishu_1766175_1_1.html。
在使用串口发送调光数据,只需要做好数据格式就可以,这样在数据处理的时候也方便。我参照一个网友写的PWM调光的方法写了我的串口调光程序,
首先讲一下串口发送的数据格式,R+数据+G+数据+B+数据+#,R,G,B代表着三种颜色,后面跟着的数据数PWM调光参数0-999,最后#号代表着数据发送完毕,这样在处理PWM参数的有效数据的时候的方便一些,发送数据的格式是可以改的(根据个人喜好可以随意更改,但是在数据处理部分也要做相应的修改),(发送格式如图1所示)分析处理数据的格式如程序所示。
- void usartdate(char *buff)
- {
- u16 r_num,g_num,b_num;
- u8 length;
- //定义数据的长度分别存储三路PWM占空比的数据
- char buffR[20],buffG[20],buffB[20];
- //设置字符串指针以此方便查询关键字R G B
- char *R,*G,*B;
-
- length = strlen(buff);
- //C语言库函数查询关键字R第一次出现的指针地址给R
- R = strstr(buff,"R");
- //C语言库函数查询关键字G第一次出现的指针地址给G
- G = strstr(buff,"G");
- //C语言库函数查询关键字B第一次出现的指针地址给B
- B = strstr(buff,"B");
- //复制字符串,buffR是缓冲数组 G-R-1是复制数组的长度,
- //指针相加减必须是指向同一个数组的地址否则指针加减无意义
- strncpy(buffR,R+1,G-R-1);
- //加上'\0'为结尾字符
- buffR[G-R-1] = '\0';
-
- strncpy(buffG,G+1,B-G-1);
- buffR[B-G-1] = '\0';
-
- strncpy(buffB,B+1,length-(B-buff)-1);
- buffR[length-(B-buff)-1] = '\0';
- //atoi函数#include
- //原型 : int atoi( const char *str );
- //功能:将字符串str转换成一个整数并返回结果。参数str
- // 以数字开头,当函数从str中读到非数字字符则结束转换并将结果返回也就是为什么要加'\0'这个字符
- r_num = atoi(buffR);
- g_num = atoi(buffG);
- b_num = atoi(buffB);
- // 设置比较输出PWM输出占空比
- // tiM_SetCompare1(TIM2,xxx); //G
- switch_date(g_num,r_num,b_num);
- printf("r_num = %d
- ",r_num);
- delay_ms(10);
- printf("g_num = %d
- ",g_num);
- delay_ms(10);
- printf("b_num = %d
- ",b_num);
- delay_ms(10);
- }
复制代码
这样就可以通过串口得到有用的信息,但是缺点是有时候不灵敏,更改数据长度会导致串口发送的数据不能有效的使用。解决方法我还没有想到。。。 发送格式如图1所示
图1 效果显示如图2所示 图2 这里提醒一下的更改串口接收函数
- void USART1_IRQHandler(void)
- {
- char Res;
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
- {
- Res = USART_ReceiveData(USART1); //读取接收到的数据
- if(Res == '#')
- {
- strncpy(table,USART_RX_BUF,USART_RX_STA);
- memset(USART_RX_BUF,0,USART_RX_STA);
- USART_RX_STA = 0;
- flag = 1;
- }
- else
- {
- USART_RX_BUF[USART_RX_STA] = Res;
- USART_RX_STA++;
- }
- }
- }
复制代码
这样就可以用串口发送RGB灯的参数进行调光,我是看了微信的一个网友写的上位机调RGB灯我才想到着这片帖子的,本人菜鸟一枚如果有些地方写的不对请麻烦通知我,我做修改,谢谢。
`
|