1. 程式人生 > >linux多執行緒下開啟串列埠傳送和接收資料

linux多執行緒下開啟串列埠傳送和接收資料

1 啟動執行緒1讀串列埠

2 等待3秒後

3 啟動執行緒2寫串列埠,傳送字串後關閉

4 等待10秒

5 關閉兩個執行緒

  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <sys/time.h>
  4. #include <string.h>
  5. #include<termios.h>
  6. #include<sys/stat.h>
  7. #include<fcntl.h>
  8. #define BAUDRATE B115200
  9. #define MODEMDEVICE "/dev/ttyS0"
  10. #define R_BUF_LEN (256)
  11. void printtid(void);  
  12. void* com_read(void* pstatu)  
  13. {  
  14.     printtid();  
  15.     int i=0;  
  16.     int fd,c=0,num;  
  17.     struct termios oldtio,newtio;  
  18.     char buf[R_BUF_LEN];  
  19.     printf("start.../n");  
  20.     /*開啟PC機的COM1通訊埠*/
  21.     fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY | O_NONBLOCK/*| O_NDELAY*/);  
  22.     if(fd<0)  
  23.     {  
  24.         perror(MODEMDEVICE);  
  25.         exit(1);  
  26.     }  
  27.     printf("open .../n");  
  28.     /*將目前終端機的結構儲存至oldtio結構*/
  29.     tcgetattr(fd,&oldtio);  
  30.     /*清除newtio結構,重新設定通訊協議*/
  31.     bzero(&newtio,sizeof(newtio));  
  32.     /*通訊協議設為8N1,8位資料位,N沒有效驗,1位結束位*/
  33.     newtio.c_cflag = BAUDRATE |CS8|CLOCAL|CREAD;  
  34.     newtio.c_iflag = IGNPAR;  
  35.     newtio.c_oflag = 0;  
  36.     /*設定為正規模式*/
  37.     newtio.c_lflag=ICANON;  
  38.     /*清除所有佇列在串列埠的輸入*/
  39.     tcflush(fd,TCIFLUSH);   /*新的termios的結構作為通訊埠的引數*/
  40.     tcsetattr(fd,TCSANOW,&newtio);  
  41.     printf("reading.../n");  
  42.     while(*(int*)pstatu)  
  43.     {  
  44.         num = read(fd,buf, R_BUF_LEN);  
  45.         buf[R_BUF_LEN-1] = 0;  
  46.         if(num > 0 && num <= R_BUF_LEN)  
  47.         {   
  48.             buf[num]=0;  
  49.             printf("%s", buf);  
  50.             fflush(stdout);  
  51.         }  
  52.     }  
  53.     printf("close.../n");  
  54.     close(fd);  
  55.     /*恢復舊的通訊埠引數*/
  56.     tcsetattr(fd,TCSANOW,&oldtio);  
  57. }  
  58. void* com_send(void* p)  
  59. {  
  60.     printtid();  
  61.     int fd,c=0;  
  62.     struct termios oldtio,newtio;  
  63.     char ch;  
  64.     staticchar s1[20];  
  65.     printf("Start.../n ");  
  66.     /*開啟arm平臺的COM1通訊埠*/
  67.     fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY);  
  68.     if(fd<0)  
  69.     {  
  70.         perror(MODEMDEVICE);  
  71.         exit(1);  
  72.     }  
  73.     printf(" Open.../n ");  
  74.      /*將目前終端機的結構儲存至oldtio結構*/
  75.        tcgetattr(fd,&oldtio);  
  76.     /*清除newtio結構,重新設定通訊協議*/
  77.     bzero(&newtio,sizeof(newtio));  
  78.     /*通訊協議設為8N1*/
  79.     newtio.c_cflag =BAUDRATE |CS8|CLOCAL|CREAD; //波特率 8個數據位 本地連線 接受使能
  80.     newtio.c_iflag=IGNPAR;                      //忽略奇偶校驗錯誤
  81.     newtio.c_oflag=0;  
  82.     /*設定為正規模式*/
  83.     newtio.c_lflag=ICANON;                     //規範輸入
  84.     /*清除所有佇列在串列埠的輸出*/
  85.     tcflush(fd,TCOFLUSH);  
  86.     /*新的termios的結構作為通訊埠的引數*/
  87.     tcsetattr(fd,TCSANOW,&newtio);  
  88.     printf("Writing.../n ");  
  89.     ///*
  90.     while(*(char*)p != 0)  
  91.     {  
  92.         int res = 0;  
  93.         res = write(fd,(char*)p, 1);  
  94.         if(res != 1) printf("send %c error/n", *(char*)p);  
  95.         else printf("send %c ok/n", *(char*)p);  
  96.         ++p;  
  97.     }  
  98.     printf("Close.../n");  
  99.     close(fd);  
  100.     /*還原舊的通訊埠引數*/  
  101.     tcsetattr(fd,TCSANOW,&oldtio);  
  102.     printf("leave send thread/n");  
  103. }  
  104. /* 
  105.     開始執行緒 
  106.     thread_fun  執行緒函式 
  107.     pthread     執行緒函式所在pthread變數 
  108.     par     執行緒函式引數 
  109.     COM_STATU   執行緒函式狀態控制變數 1:執行 0:退出 
  110. */
  111. int start_thread_func(void*(*func)(void*), pthread_t* pthread, void* par, int* COM_STATU)  
  112. {  
  113.     *COM_STATU = 1;  
  114.     memset(pthread, 0, sizeof(pthread_t));  
  115.     int temp;  
  116.         /*建立執行緒*/
  117.         if((temp = pthread_create(pthread, NULL, func, par)) != 0)  
  118.         printf("執行緒建立失敗!/n");  
  119.         else
  120.     {  
  121.         int id = pthread_self();  
  122.                 printf("執行緒%u被建立/n", *pthread);  
  123.     }  
  124.     return temp;  
  125. }  
  126. /* 
  127.     結束執行緒 
  128.     pthread     執行緒函式所在pthread變數 
  129.     COM_STATU   執行緒函式狀態控制變數 1:執行 0:退出 
  130. */
  131. int stop_thread_func(pthread_t* pthread, int* COM_STATU)  
  132. {  
  133.     printf("prepare stop thread %u/n", *pthread);  
  134.     *COM_STATU = 0;  
  135.     if(*pthread !=0)   
  136.     {  
  137.                 pthread_join(*pthread, NULL);  
  138.     }  
  139.     printf("執行緒%d退出!/n", *COM_STATU);  
  140. }  
  141. void printtid(void)  
  142. {  
  143.     int id = pthread_self();  
  144.         printf("in thread %u/n", id);  
  145. }  
  146. int main()  
  147. {  
  148.     pthread_t thread[2];  
  149.     printtid();  
  150.     constint READ_THREAD_ID = 0;  
  151.     constint SEND_THREAD_ID = 1;  
  152.     int COM_READ_STATU = 0;  
  153.     int COM_SEND_STATU = 0;  
  154.     if(start_thread_func(com_read, &thread[READ_THREAD_ID],  &COM_READ_STATU, &COM_READ_STATU) != 0)  
  155.     {  
  156.         printf("error to leave/n");  
  157.         return -1;  
  158.     }  
  159.     printf("wait 3 sec/n");  
  160.     sleep(3);  
  161.     printf("wake after 3 sec/n");  
  162.     if(start_thread_func(com_send, &thread[SEND_THREAD_ID], "ABCDEFGHIJKLMNOPQRST", &COM_SEND_STATU) != 0)  
  163.     {  
  164.         printf("error to leave/n");  
  165.         return -1;  
  166.     }  
  167.     printtid();  
  168. 相關推薦

    linux執行開啟串列傳送接收資料

    1 啟動執行緒1讀串列埠 2 等待3秒後 3 啟動執行緒2寫串列埠,傳送字串後關閉 4 等待10秒 5 關閉兩個執行緒 #include <pthread.h> #include <stdio.h> #include <sys/time.h> #include &

    【C語言實現串列通訊知識點整理(一)】執行開啟串列、設定波特率、設定校驗位、互斥鎖等實現基本的通訊

      部分程式碼借鑑地址:https://blog.csdn.net/wangqingchuan92/article/details/73497354/ 謝謝! 1.建立執行緒線上程內進行串列埠之間的收發 void CREAT_pthread(void) { pthr

    Linux執行學習(4) --讀寫鎖其他型別的鎖以及執行安全

    多執行緒學習總結(1):https://blog.csdn.net/hansionz/article/details/84665815 多執行緒學習總結(2):https://blog.csdn.net/hansionz/article/details/84675536 多執行緒學習總結

    PIC24串列傳送接收程式

    做智慧家居時,下位機用的時PIC24FJ64GA004,所以寫了下面那個程式。 由於對PIC24的不熟悉,忘了加配置們,導致波特率一直不對,後面加上配置位就行了。 接收的資料按一定格式,用來控制繼電器。 傳送的資料暫時沒用到。啟用傳送只要使能中斷就行。 1

    gsm模組 POST協議 串列傳送接收(sim900a)

    串列埠發:AT+CIPSTART="TCP","211.xxx.xxx.xxx",80 串列埠收:OK CONNECT OK 串列埠發:AT+CIPSEND=533                                    (下面串列埠傳送資料的長度) 串列埠收

    linux 執行串列程式設計總結

    最近在玩DJI M100,呼叫API獲取GPS位置時發現高程定位完全是錯的(負的幾百多米),查了一下文件說高程資料是由氣壓計得到的,而飛行控制時又需要比較可靠的高度資訊,於是乎決定用上我們實驗室的搭載Ublox晶片的板子搞事情,在子執行緒通過串列埠接收板子的定位結果,在主執

    linux執行環境的搶屍行為(system返回-1:No child processes)

    #!/usr/bin/env python #coding:utf8 import os import time pid = os.fork() if pid: print 'in parent.sleepin....' while True:

    HashMap在執行會形成環形連結串列

    導讀:經過前面的部落格總結,可以知道的是,HashMap是有一個一維陣列和一個連結串列組成,從而得知,在解決衝突問題時,hashmap選擇的是鏈地址法。為什麼HashMap會用一個數組這連結串列組成,當時給出的答案是從那幾種解決衝突的演算法中推論的,這裡給出一個正面的理由:1

    執行HashMap的死迴圈

    多執行緒下HashMap的死迴圈 Java的HashMap是非執行緒安全的。多執行緒下應該用ConcurrentHashMap。 多執行緒下[HashMap]的問題(這裡主要說死迴圈問題): 1、多執行緒put操作後,get操作導致死迴圈。 2、多執行緒

    Linux執行程式設計---執行間同步(互斥鎖、條件變數、訊號量讀寫鎖)

    本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導

    LINUX 執行 JNI 回撥 java static

    1.Linux 開啟執行緒 //渲染執行緒Rendering void* thread_rendering_process(void *lParam) {     unsigned int local_wr;     int index; &

    linux 執行之訊號量 sem_init

    1. 什麼是訊號量 linux sem 訊號量是一種特殊的變數,訪問具有原子性, 用於解決程序或執行緒間共享資源引發的同步問題。 使用者態程序對 sem 訊號量可以有以下兩種操作: 等待訊號量 當訊號量值為 0 時,程式等待;當訊號量值大於 0 時,訊號量減 1,程式

    Linux執行學習總結

    原文:https://www.cnblogs.com/luoxn28/p/6087649.html Linux多執行緒學習總結   執行緒是程式中完成一個獨立任務的完整執行序列,即一個可排程的實體;程序相當於執行中程式的一種抽象。根據執行環境的排程者的身份,執行緒可分為核心執行緒和使用者執行

    Linux執行/客戶程式設計參考/程式碼

    Linux多執行緒/多客戶程式設計參考/程式碼 (1)linux多執行緒程式設計例項及講解 https://blog.csdn.net/m0_37051593/article/details/80719469 (2)Linux多執行緒程式設計——多執行緒與執行緒同步 https://

    執行synchronized修飾static方法與非static方法的區別

    一直對多執行緒的概念比較模糊,今天就寫了個關於變數原子操作的小程式,好讓自己加深一下理解 程式碼如下:     package atomic;   public class JoinThread extends Thread {

    Boost ptree 解析json字串 執行程式crash

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    JavaSE基礎學習筆記及案例(二)執行()與簡單工廠模式的瞭解

    1.多執行緒(下) 1.1單例設計模式:保證類在記憶體中只存在一個物件 ************餓漢式與懶漢式的區別【面試題】 餓漢式單例模式:以空間換時間 懶漢式單例模式:以時間換空間(不推薦使用,僅在面試中用到) 3.多執行緒訪問時:餓漢式不會建立多個物件;而懶漢式

    Linux執行同步機制

    一、互斥鎖 儘管在Posix Thread中同樣可以使用IPC的訊號量機制來實現互斥鎖mutex功能,但顯然semphore的功能過於強大了,在Posix Thread中定義了另外一套專門用於執行緒同步的mutex函式。 1. 建立和銷燬    有兩種方法建

    Linux 執行程序的區別(小結)

    最近學習Linux,看到“hairetz的專欄”的帖子不錯,特轉來大家一起學習。 很想寫點關於多程序和多執行緒的東西,我確實很愛他們。但是每每想動手寫點關於他們的東西,卻總是求全心理作祟,始終動不了手。 今天終於下了決心,寫點東西,以後可以再修修補補也無妨。一.為何需要多程序(或者多執行緒),為何需

    linux執行執行資料TSD Thread Specific Data

    在linux中,同一程序下所有執行緒是共享全域性變數的,但有時候會有這樣的需求,某一個執行緒想單獨用於某個全域性變數。這就有了TSD,Thread Specific Data。 使用TSD時需要建立一個全域性的鍵值,每個執行緒都通過鍵值來設定和獲取自己所獨有的全域性變數。 使用TSD分為