• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Linux 串口編程

    標簽: linux  windows  編程  設計  終端

    首先了解一下終端,Linux 下包括當前終端、前臺控制臺終端、串口和虛擬終端主設備,這些終端均被映射成一個文件(即設備文件),從而能用文件IO函數來操作這些文件來控制終端。

    實際的物理串口: 即串口終端/dev/ttyS[n],ttyS系列指的是物理串行接口,即ttyS0為COM1,ttyS1為COM2。

    若使用當前主機串口通過串口線連接到另一臺主機的串口時,就能直接通信。

    若使用的是VMware虛擬機方式,則可以用windows文件來代替串口,設置方法如下:

    首先將虛擬機置為Power Off狀態(很重要!否則不能設置),

    點擊虛擬機菜單“VM -- setting”,

    沒有seria port一項,點擊Add--Serial Port,

    選擇next---然后選擇OutPut to file 繼續next,

    然后選擇關聯的windows文件,Finish,就設置完成了,

    然后可以看到在Hardware里面有串口設備一項了。


    重啟虛擬機,如下圖可以看到左數第六項圖標變綠,說明設置成功。


    下面測試是否能進行串口通信。

    給出《linux高級程序設計》中的一段代碼:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fctnl.h>
    #include<errno.h>
    #include<termios.h>
    #include<curses.h>
    
    int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300,
    						B38400, B19200, B9600, B4800, B2400, B1200, B300,};
    int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300,
    						38400, 19200, 9600, 4800, 2400, 1200, 300,};
    //終端屬性結構體定義
    #define NCCS 19 
    
    struct termios {
    	tcflag_t c_iflag;		//輸入屬性 
    	tcflag_t c_oflag;		//輸出屬性 
    	tcflag_t c_cflag;		//控制屬性 
    	tcflag_t c_lflag;		//本地屬性 
    	cc_t c_line;			//線路規程屬性 
    	cc_t c_cc[NCCS];		//控制字符 
    };
    
    //fd is the open tty; speed is the rate 
    void set_speed(int fd, int speed)
    {
    	int i;
    	int status;
    	struct termios Opt;
    	
    	tcgetattr(fd, &Opt);								//獲取打開終端的屬性 
    	for( i = 0; i < sizeof(speed_arr)/sizeof(int); i++)
    	{
    		if(speed == name_arr[i])
    		{
    			tcflush(fd, TCIOFLUSH);	
    				cfsetispeed(&Opt, speed_arr[i]);		//設置輸入波特率屬性 
    				cfsetospeed(&Opt, speed_arr[i]);		//設置輸出波特率屬性 
    				status = tcsetattr(fd, TCSANOW, &Opt);	//設置屬性,TCSANOW表示改變立即發生 
    				if(status != 0)
    				perror("tcsetattr fd1");
    				return;
    		}	
    		tcflush(fd, TCIOFLUSH);
    	}
    	
    }
    //set data bit, stop bit and checksum bit
    int set_Parity(int fd, int databits, int stopbits, int parity)
    {
    	struct termios options;
    	if( tcgetattr( fd, &options) != 0)
    	{
    		perror("SetupSerial 1");
    		return(FALSE);	
    	}
    	options.c_cflag &= ~CSIZE;			//清除現在的數據位寬度位 
    	switch(databits)
    	{
    		case 7:
    			options.c_cflag |= CS7;
    			break;
    		case 8:
    			options.c_cflag |= CS8;		//設置每幀數據位為 8 bit 
    			break;
    		default:
    			fprintf(stderr,"Unsupported data size\n");
    			return(FALSE);	
    	}
    	//INPCK 使能奇偶校驗 PARENB 允許輸出產生奇偶信息以及輸入的奇偶校驗 PARDD輸入
    	//和輸出是奇校驗方式  CSTOPB設置兩位停止位而不是一位 
    	switch (parity)
    	{
    		case 'n':
    		case 'N':
    			options.c_cflag &= ~PARENB;			//clear parity enable
    			options.c_iflag &= ~INPCK;			//enable parity checking
    			break;
    		case 'o':
    		case 'O':
    			options.c_cflag |= (PARODD | PARENB);	//set as odd check
    			options.c_iflag |= INPCK;				//disnable parity check
    			break;
    		case 'e':
    		case 'E':
    			options.c_cflag |= PARENB;				//enable parity
    			options.c_cflag &= ~PARODD;
    			options.c_iflag |= INPCK;				//disnable parity checking
    			break;
    		case 'S':
    		case 's':
    			options.c_cflag &= ~PARENB;
    			options.c_cflag &= ~CSTOPB;
    			break;
    		default:
    			fprintf(stderr,"Unsupported parity\n");
    			return(FALSE);		
    	}
    	switch(stopbits)
    	{
    		case 1:
    			options.c_cflag &= ~CSTOPB;
    			break;
    		case 2:
    			options.c_cflag |= CSTOPB;
    			break;
    		default:
    			fprintf(stderr,"Unsupported stop bits\n");
    			return(FALSE);	
    	}
    	//set input parity option
    	if(parity != 'n')
    		options.c_iflag |= INPCK;
    	options.c_cc[VTIME] = 150;		//15 seconds
    	options.c_cc[VMIN] = 0;
    	
    	tcflush(fd, TCIFLUSH);			//update the options and do it now
    	if( tcsetattr(fd, TCSANOW, &options) != 0)
    	{
    		perror("SetupSerial 3");
    		return(FALSE);	
    	}
    	return (TRUE);
    }
    int main(int argc, char **argv)
    {
    	int fd;
    	int nread;
    	char *ptr = argv[2];
    	char *dev = argv[1];
    	
    	if(argc < 3)
    	{
    		printf("pls usage %s/dev/ttyS[n] your_message.\n", argv[1]);
    		exit(EXIT_FALURE);	
    	}
    	if((fd = open(dev, O_RDWR)) == -1)
    	{
    		perror("open");
    		exit(EXIT_FAILURE);	
    	}
    	set_speed(fd, 19200); 
    	
    	if(set_Parity(fd, 8, 1, 'N') == FALSE)
    	{
    		printf("Set Parity Error\n");
    		exit(EXIT_FAILURE);	
    	}
    	if(write(fd, ptr, strlen(ptr)) < 0)
    	{
    		perror("write");
    		exit(EXIT_FAILURE);		
    	}
    	printf("pls check the tty data\n");
    	close(fd);
    	exit(EXIT_SUCCESS);
    }

    在linux下運行:

    注意:若關聯多個串口,則不一定為ttyS1,打開windows下關聯的文件可以看到輸出信息,即完成linux與windows串口通信。

    版權聲明:本文為Irelia_freedom原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/Irelia_freedom/article/details/78833410

    智能推薦

    C——Linux下的串口編程(轉)

    之前在學習安信可A7模塊時,是在PC上使用串口調試助手做了GPS的坐標數據信息的采集,同時分析了一些語句的含義。在這過程中,涉及到對嵌入式開發人員一個非常重要的知識:串口通信。在前篇也說到,我們將會自己寫程序來對GPS數據進行解析,而這些數據正是靠串口來傳輸的。所以,本篇博文將進行關于串口通信的學習。 一、串口接頭 首先我們得知道串口長什么樣,常用的串口接頭有兩種,一種是9針串口(簡稱DB-9),...

    Linux下C語言串口應用編程

    在編寫Linux串口的C程序之前,需要包含以下頭文件: #include <termios.h> 在Linux系統中,一切皆文件,所以串口設備也是一類文件,學習過Linux驅動程序的學員都知道,Linux有三類設備:字符設備,塊設備,網絡設備。那么串口設備屬于字符設備。所以串口設備的命名一般為/dev/ttySn(n = 0、1、2......),如果該串口為USB轉串口,可能名稱為/...

    Linux 串口編程簡介和實例學習

    Linux 串口編程簡介和實例學習 一、無論是從linux官方直接下載的原生態內核還是任何一家芯片廠家提供的linux內核,都已經把串口驅動寫好了,所以在linux串口編程中,是完全不需要動手去寫串口驅動的。對于一般的程序員來說涉及比較多的是串口應用編程,這里我們就介紹一下如何調用內核提供的接口,如何進行初始化配置以及發送和接收數據。 二、查看串口設備節點,在linux系統,串口的設備節點以tty...

    linux 多線程串口編程總結

    最近在玩DJI M100,調用API獲取GPS位置時發現高程定位完全是錯的(負的幾百多米),查了一下文檔說高程數據是由氣壓計得到的,而飛行控制時又需要比較可靠的高度信息,于是乎決定用上我們實驗室的搭載Ublox芯片的板子搞事情,在子線程通過串口接收板子的定位結果,在主線程調用,開發環境為Ubuntu16.04/14.04,前者為虛擬機,后者為manifold。 1.  &nbs...

    Linux下串口編程流程介紹

    目錄 一、串口編程中struct termios結構體 二、使用串口流程 1、打開串口 2、串口配置流程 a、tcgetattr() 與 tcsetattr()控制終端 b、cfsetispeed() 與 cfsetospeed()設置波特率 c、使用掩碼設置數據位 d、使用c_cflag和c_iflag設置奇偶校驗 e、設置停止位 f、設置最少字符和等待時間 3、讀寫數據 4、關閉串口 &ems...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡