linux多執行緒下開啟串列埠傳送和接收資料
1 啟動執行緒1讀串列埠
2 等待3秒後
3 啟動執行緒2寫串列埠,傳送字串後關閉
4 等待10秒
5 關閉兩個執行緒
- #include <pthread.h>
- #include <stdio.h>
- #include <sys/time.h>
- #include <string.h>
- #include<termios.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- #define BAUDRATE B115200
- #define MODEMDEVICE "/dev/ttyS0"
-
#define R_BUF_LEN (256)
- void printtid(void);
- void* com_read(void* pstatu)
- {
- printtid();
- int i=0;
- int fd,c=0,num;
- struct termios oldtio,newtio;
- char buf[R_BUF_LEN];
- printf("start.../n");
- /*開啟PC機的COM1通訊埠*/
- fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY | O_NONBLOCK/*| O_NDELAY*/);
-
if(fd<0)
- {
- perror(MODEMDEVICE);
- exit(1);
- }
- printf("open .../n");
- /*將目前終端機的結構儲存至oldtio結構*/
- tcgetattr(fd,&oldtio);
- /*清除newtio結構,重新設定通訊協議*/
- bzero(&newtio,sizeof(newtio));
- /*通訊協議設為8N1,8位資料位,N沒有效驗,1位結束位*/
-
newtio.c_cflag = BAUDRATE |CS8|CLOCAL|CREAD;
- newtio.c_iflag = IGNPAR;
- newtio.c_oflag = 0;
- /*設定為正規模式*/
- newtio.c_lflag=ICANON;
- /*清除所有佇列在串列埠的輸入*/
- tcflush(fd,TCIFLUSH); /*新的termios的結構作為通訊埠的引數*/
- tcsetattr(fd,TCSANOW,&newtio);
- printf("reading.../n");
- while(*(int*)pstatu)
- {
- num = read(fd,buf, R_BUF_LEN);
- buf[R_BUF_LEN-1] = 0;
- if(num > 0 && num <= R_BUF_LEN)
- {
- buf[num]=0;
- printf("%s", buf);
- fflush(stdout);
- }
- }
- printf("close.../n");
- close(fd);
- /*恢復舊的通訊埠引數*/
- tcsetattr(fd,TCSANOW,&oldtio);
- }
- void* com_send(void* p)
- {
- printtid();
- int fd,c=0;
- struct termios oldtio,newtio;
- char ch;
- staticchar s1[20];
- printf("Start.../n ");
- /*開啟arm平臺的COM1通訊埠*/
- fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY);
- if(fd<0)
- {
- perror(MODEMDEVICE);
- exit(1);
- }
- printf(" Open.../n ");
- /*將目前終端機的結構儲存至oldtio結構*/
- tcgetattr(fd,&oldtio);
- /*清除newtio結構,重新設定通訊協議*/
- bzero(&newtio,sizeof(newtio));
- /*通訊協議設為8N1*/
- newtio.c_cflag =BAUDRATE |CS8|CLOCAL|CREAD; //波特率 8個數據位 本地連線 接受使能
- newtio.c_iflag=IGNPAR; //忽略奇偶校驗錯誤
- newtio.c_oflag=0;
- /*設定為正規模式*/
- newtio.c_lflag=ICANON; //規範輸入
- /*清除所有佇列在串列埠的輸出*/
- tcflush(fd,TCOFLUSH);
- /*新的termios的結構作為通訊埠的引數*/
- tcsetattr(fd,TCSANOW,&newtio);
- printf("Writing.../n ");
- ///*
- while(*(char*)p != 0)
- {
- int res = 0;
- res = write(fd,(char*)p, 1);
- if(res != 1) printf("send %c error/n", *(char*)p);
- else printf("send %c ok/n", *(char*)p);
- ++p;
- }
- printf("Close.../n");
- close(fd);
- /*還原舊的通訊埠引數*/
- tcsetattr(fd,TCSANOW,&oldtio);
- printf("leave send thread/n");
- }
- /*
- 開始執行緒
- thread_fun 執行緒函式
- pthread 執行緒函式所在pthread變數
- par 執行緒函式引數
- COM_STATU 執行緒函式狀態控制變數 1:執行 0:退出
- */
- int start_thread_func(void*(*func)(void*), pthread_t* pthread, void* par, int* COM_STATU)
- {
- *COM_STATU = 1;
- memset(pthread, 0, sizeof(pthread_t));
- int temp;
- /*建立執行緒*/
- if((temp = pthread_create(pthread, NULL, func, par)) != 0)
- printf("執行緒建立失敗!/n");
- else
- {
- int id = pthread_self();
- printf("執行緒%u被建立/n", *pthread);
- }
- return temp;
- }
- /*
- 結束執行緒
- pthread 執行緒函式所在pthread變數
- COM_STATU 執行緒函式狀態控制變數 1:執行 0:退出
- */
- int stop_thread_func(pthread_t* pthread, int* COM_STATU)
- {
- printf("prepare stop thread %u/n", *pthread);
- *COM_STATU = 0;
- if(*pthread !=0)
- {
- pthread_join(*pthread, NULL);
- }
- printf("執行緒%d退出!/n", *COM_STATU);
- }
- void printtid(void)
- {
- int id = pthread_self();
- printf("in thread %u/n", id);
- }
- int main()
- {
- pthread_t thread[2];
- printtid();
- constint READ_THREAD_ID = 0;
- constint SEND_THREAD_ID = 1;
- int COM_READ_STATU = 0;
- int COM_SEND_STATU = 0;
- if(start_thread_func(com_read, &thread[READ_THREAD_ID], &COM_READ_STATU, &COM_READ_STATU) != 0)
- {
- printf("error to leave/n");
- return -1;
- }
- printf("wait 3 sec/n");
- sleep(3);
- printf("wake after 3 sec/n");
- if(start_thread_func(com_send, &thread[SEND_THREAD_ID], "ABCDEFGHIJKLMNOPQRST", &COM_SEND_STATU) != 0)
- {
- printf("error to leave/n");
- return -1;
- }
- printtid();
-
相關推薦
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分為