Linux 串口編程
首先了解一下終端,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串口通信。
智能推薦
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...
猜你喜歡
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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...