` 本帖最后由 weiyaoxing 于 2017-2-17 01:08 编辑
本来是想做基于网页控制的无线点灯跟温度获取,类似于下图的效果。想通过web按钮控制串口向串口发送数据控制zigbee,我以为会比较简单,在群里面问了好多大神,由于我没学过js等web相关的脚本语言。要想实现起来是在太麻烦了。所以现在只做成了这个样子,我使用的是Bottle框架。在pi上输入ip地址能显示网页,但是还不能向串口发送数据,以后有再学习。在这里附上我的半成品以及bottle源码。
所以现在我只能通过终端向串口发送数据,来控制zigbee以及接受zigbee发送过来的温度数据。
一、minicom串口终端控制
由于ubuntu16.04的源自带了minicom 可以直接 apt install minicom 来直接安装。
对于minicom的使用见我之前写过的帖子。 https://bbs.elecfans.com/jishu_1102788_1_1.html
这里我们使用的是串口 ttyS1 看一下zero的原理图,
找到UART1_TX RX,然后就可以向串口发送以及接受数据了。
二、串口编程控制无线电灯以及获取温度
有关于串口编程的也可以看我之前写过的帖子,https://bbs.elecfans.com/jishu_1098159_1_1.html
在这里我就直接附上代码了。
实验需向zigbee获取温度数据和向串口发送数据,两个放在一起不能同时进行,所以我使用的linux的多线程编程。
板子使用的armbian系统,貌似不带pthread库,所以通过手工来安装pthread库
- sudo apt-get install glibc-doc
- sudo apt-get install manpages-posix-dev
复制代码
然后用man -k pthread_create就可以找到了,但是在gcc编译的时候出现了错误,一直出现
undefined reference to `pthread_create'
错误,后来在网上找了之后看见了这个博客里面说的“我们现在应该使用 -pthread 而不是 -lpthread”,后来也就能成功编译了。(详细看链接)
http://blog.chinaunix.net/uid-25909722-id-3026989.html
程序在主函数开头创建 Control_Led() 进程以及对串口进行初始化工作,然后不断读取串口发送来的温度数据。
- int main(int argc, char **argv)
- {
-
- int n;
- int nread;
- char buff[512];
- char *dev ="/dev/ttyS1"; //串口1句柄
-
- //创建线程
- pthread_t id;
- pthread_create(&id, NULL, Control_Led, NULL);
-
- ttyS1 = OpenDev(dev); //打开串口1
- if (ttyS1>0)
- {
- set_speed(ttyS1,9600);
- printf("Serial OK
- ");
- }
- else
- {
- printf("Can't Open Serial Port!
- ");
- exit(0);
- }
- if (set_Parity(ttyS1,8,1,'N')== FALSE)
- {
- printf("Set Parity Error
- ");
- exit(1);
- }
- printf("Starting
- ");
- while(1)
- {
- while((nread = read(ttyS1,buff,512))>0)
- {
- //printf(" Len %d
- ",nread);
- buff[nread+1]='\0';
- printf("%s
- ",buff);
- printf("ok
- ");
- }
- }
- close(ttyS1);
- exit(0);
- }
复制代码
Control_Led() 线程不断检测是否有输入,有输入则对数据进行对比,若是led1则向串口发送led1...
- void* Control_Led( )
- {
- char flag[10]={0};
- while(1)
- {
- scanf("%s",flag);
- if(!strcmp(flag,"led1"))
- {
- write(ttyS1, "led1", 4);
- strcpy(flag,"0");
- }
- else if(!strcmp(flag,"led2"))
- {
- write(ttyS1, "led2", 4);
- strcpy(flag,"0");
- }
- }
- }
复制代码
通过对zigbee模块的编程,zigbee模块不断检测串口发送过来的数据,若是led1则向另外一个zigbee模块发送数据来点亮led1,同时每隔一秒钟向串口发送mcu温度数据
- /****温度转换成ascii码发送****/
- TempValue[0] = (unsigned char)(AvgTemp)/10 + 48; //十位
- TempValue[1] = (unsigned char)(AvgTemp)%10 + 48; //个位
- TempValue[2] = '.'; //小数点
- TempValue[3] = (unsigned char)(AvgTemp*10)%10+48; //十分位
- TempValue[4] = (unsigned char)(AvgTemp*100)%10+48; //百分位
- TempValue[5] = '\0'; //字符串结束符
- UartTX_Send_String( TempValue,6);
- Delayms(2000); //使用32M晶振,故这里2000约等于1S
复制代码
这是获取到的温度的图(有点不准,没那么热,实际温度应该在20°左右吧==南方)
|