原创 UFUN开发板实验笔记(3)

2019-8-26 22:00 2404 20 20 分类: MCU/ 嵌入式 文集: 开发板笔记

     前面两期让UFUN开发板有了“嘴”,有了表达交流的元素工具——可显示的字符。接下来是什么呢?当然是让UFUN开发板交流起来。交流就是我问你答,我们的每一次表达都能得到适当的回应,这样就具备智能的潜质。就像微软的小兵、阿里的天猫精灵、小米的小爱,搭配了语音识别和语音合成后,已经开始具备了机器人部分特性。那就让UFUN交流起来吧,通过OLED屏幕响应PC通过USB转串口模块传送的信息。预想的效果是每次PC端发送一个ASC码字符,UFUN会通过OLED告诉我们收到了什么字符,此字符的ASC码是多少。

       主程序很简单,就是初始化后显示一个等待PC端发送ASC码字符的界面。
  1. int main(void)
  2. {
  3. extern unsigned char R_str[2];// 全局字符串变量R_str[2],用于串口接收数据传送
  4. extern uint8_t ucTemp;
  5. uint8_t send_flag=0; //发送标志位
  6. USART_Config(); //串口配置
  7. NVIC_Config(); //中断配置
  8. DelayInit();
  9. I2C_Configuration();
  10. OLED_Init();
  11. OLED_Fill(0x00);//清屏
  12. while(1)
  13. {
  14. OLED_ShowStr(0,0,"UFUN_PC Talk:",1);// 标题测试6*8字符
  15. OLED_ShowStr(0,2,">",1);// 标题测试6*8字符
  16. DelayS(1);
  17. }

      参考了UFUN的串口通讯例程,在主程序里设置了一个全局字符串变量R_str[2],用于传送串口接收中断子程序接收的ASC码。就是在这一步差点把人逼疯,出现很多难以想象异常现象:接收到的回送数值无缘无故就变成一个很大的值,比如0xFE、0xE0,在OLED上只能显示一个乱码,如果在串口接收中断子程序和主程序同时回送时子程序回送的数值是对的,那就直接在中断子程序完成回送和显示吧,其结果又是照错不误。


      串口发送0x77,回送的数值莫名其妙地变成0xF7,反反复复的修改都试了,就是这么个结果。不多说了,把串口接收中断子程序贴上,希望能得到大牛们指导性的回应。
  1. void USART1_IRQHandler()<span style="white-space:pre"> </span>//串口接收中断
  2. {
  3. if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  4. {
  5. ucTemp = USART_ReceiveData( USART1 );
  6. Usart_SendByte(USART1,ucTemp);//回送
  7. R_str[0] = ucTemp; //传送接收数据到main.c
  8. R_str[1] = 0;<span style="white-space:pre"> </span>
  9. OLED_Fill(0x00);//清屏
  10. OLED_ShowStr(0,0,"UFUN_PC Talk:",1);// 标题测试6*8字符
  11. OLED_ShowStr(0,2,">",1);// 标题测试6*8字符
  12. OLED_ShowStr(10,2,R_str,1);// 显示接收字符
  13. OLED_ShowStr(0,4,"<You entered ",1);// 标题测试6*8字符
  14. OLED_ShowStr(88,4,R_str,1);// 显示接收字符
  15. OLED_ShowStr(0,6,"<ASC: ",1);
  16. Ascii2Hex(R_str,R_hex);
  17. OLED_ShowStr(36,6,R_hex,1);<span style="white-space:pre"> </span>
  18. DelayS(1);
  19. }

      用于显示码值的ASC转HEX十六进制字符串子程序好像也有问题,不能显示数值内容,一并贴上了。
  1. int Ascii2Hex(char* ascii, char* hex)
  2. {
  3. int i, len = strlen(ascii);
  4. char chHex[] = "0123456789ABCDEF";
  5. for (i = 0; i<len; i++)
  6. {
  7. hex[i*3] = chHex[(ascii[i]) >> 4];
  8. hex[i*3 +1] = chHex[(ascii[i]) & 0xf];
  9. hex[i*3 +2] = ' ';
  10. }
  11. hex[len * 3] = '\0';
  12. return len * 3;
  13. }

      最后附上一个没有达到预期效果的程序运行效果图片,这是一个失败的编程经历,到现在也没弄清问题到底出在哪里,留待以后经验丰富了回头分析。



作者: lyyinhe_xi, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-218568.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
20
关闭 站长推荐上一条 /2 下一条