树莓派3B Linux下C++多线程编程
来源:互联网 发布:算法设计技巧与分析ppt 编辑:程序博客网 时间:2024/05/17 03:54
下面的代码手动创建了两个线程,一个线程是读取串口的数据,另一个线程是通过UDP来读取网络通信收到的数据。加上main函数的线程,一共三个线程。
先简单讲一下多线程的创建,
pthread_t serial; int ser = pthread_create(&serial,NULL,connectSerial,NULL); if(ser != 0) { std::cout << "pthread creat serial error"<<std::endl; }
connectSerial是创建的线程的入口函数。
void *connectSerial(void *args){ int fd; if(wiringPiSetup() < 0) exit(1); if((fd = serialOpen("/dev/ttyAMA0",115200)) < 0) exit(1); //long int i = 0; int datareceive = 0; while(1) { datareceive = serialGetchar(fd); intToHex(datareceive,&basebuff[baselen],2); baselen += 2; } serialClose(fd);}
完整代码:
#include <stdio.h>#include <iostream>#include <wiringPi.h>#include <wiringSerial.h>#include <vector>#include <unistd.h>#include <sys/types.h> #include <sys/socket.h> #include <pthread.h> #include <netinet/in.h> #include <string.h> #include <stdlib.h> #include <arpa/inet.h>std::vector<char> basebuff(1024*1024*10,0);std::vector<char> roverbuff(1024*1024*10,0);long int baselen = 0;long int roverlen = 0;void *creatWiFi(void *args){ struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(8000); addr.sin_addr.s_addr = htonl(INADDR_ANY); int sock; if ( (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); exit(1); } //long int roverptr = 0; struct sockaddr_in clientAddr; int n; int len = sizeof(clientAddr); while (1) { n = recvfrom(sock,&roverbuff[roverlen], 511, 0, (struct sockaddr*)&clientAddr, (socklen_t*)&len); if (n>0) { roverlen += n; } else { perror("recv"); break; } } }void intToHex(int dec,char *output,int length){ const char * hex = "0123456789ABCDEF"; for(int i = 0;i < length;i++) { output[length-i-1] = hex[(dec >> i * 4) & 0x0F]; }}void *connectSerial(void *args){ int fd; if(wiringPiSetup() < 0) exit(1); if((fd = serialOpen("/dev/ttyAMA0",115200)) < 0) exit(1); //long int i = 0; int datareceive = 0; while(1) { datareceive = serialGetchar(fd); intToHex(datareceive,&basebuff[baselen],2); baselen += 2; } serialClose(fd);}int main(){ pthread_t serial; int ser = pthread_create(&serial,NULL,connectSerial,NULL); if(ser != 0) { std::cout << "pthread creat serial error"<<std::endl; } pthread_t wifi; int wif = pthread_create(&wifi,NULL,creatWiFi,NULL); if(wif != 0) { std::cout << "pthread creat serial error"<<std::endl; } FILE *base; base = fopen("/home/pi/wifi/base.txt","w+"); if(base == NULL) { std::cout << "basefileerror"; return 1; } FILE *rover; rover = fopen("/home/pi/wifi/rover.txt","w+"); if(rover == NULL) { std::cout << "roverfileerror"; return 1; } long int blen = 0; long int rlen = 0; while(1) { if(baselen - blen >= 100) { std::cout<<"savebasebuff!"<<std::endl; fwrite(&basebuff[blen],sizeof(char),100,base); } if(roverlen - rlen >= 100) { std::cout<<"saveroverbuff!"<<std::endl; fwrite(&roverbuff[rlen],sizeof(char),100,rover); } } pthread_exit(NULL); return 0;}
上面的代码用到了Wiring Pi库,所以编译语句:
g++ -Wall serial.cpp -o serial -lwiringPi -lpthread
如果没有使用wiringPi库的编译时去掉-lwiringPi。
阅读全文
1 0
- 树莓派3B Linux下C++多线程编程
- Linux下C多线程编程
- Linux下C多线程编程
- linux下C语言多线程编程实例
- Linux下的C多线程编程
- Linux下的C多线程编程
- linux下C语言多线程编程实例
- linux下C语言多线程编程实例
- linux下C语言多线程编程实例
- Linux下的C多线程编程
- linux下C语言多线程编程实例
- linux下C语言多线程编程实例
- linux下C语言多线程编程实例
- linux下C语言多线程编程实例
- linux下C语言多线程编程实例
- linux下C语言多线程编程实例
- Linux下的C语言多线程编程
- linux下C语言多线程编程实例
- 前期准备
- 模块化机房解决方案(效果图)
- cf待补 (hash 的写法)
- hadoop3.0可用【 GA】版发布与alpha1版比较有哪些不同
- Androidstudio预览布局文件时弹出一些Rendering Problems:classes could not be instantiated
- 树莓派3B Linux下C++多线程编程
- webbench1-5源码分析
- Linux用于嵌入式
- 弘智教育-效果图8-书房建模-柜子玻璃门等
- Codeforces Round #451 (Div. 2) C
- 测试
- 弘智教育-效果图9-卧室建模-飘窗
- 20171217---Day019
- 微信支付-扫码支付-原生支付-统一下单-参数说明