树莓派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。

原创粉丝点击