Ⅰ linux串口連接ttyS0、ttyS1是什麼意思
這是通信串口名稱。
在Linux環境下,串口名從ttyS0開始依次是ttyS1、ttyS2等。在本程序中,使用ttyS0作為通信串口。在打開ttyS0的時候,選項 O_NOCTTY 表示不能把本串口當成控制終端,否則用戶的鍵盤輸入信息將影響程序的執行; O_NDELAY表示打開串口的時候,程序並不關心另一端 的串口是否在使用中。在Linux中,打開串口設備和打開普通文件一樣,使用的是open()系統調用。比如我么打開串口設備1也就是COM1,只需要:
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY );
打開的串口設備有很多設置選項。本文中使用int setup_com(int fd)設置。在系統頭文件中 定義了終端控制結構struct termios,tcgetattr()和tcsetattr()兩個系統函數獲得和設置這些屬性。結構 struct termios中的域描述的主要屬性包括:
c_cflag : 控制選項
c_lflag : 線選項
c_iflag : 輸入選項
c_oflag :輸出選項
c_cc :控制字元
c_ispeed :輸入數據波特率
c_ospeed :輸出數據波特率
如果要設置某個選項,那麼就使用"|=「運算,如果關閉某個選項就使用」&=「和」~"運算。本文使用的各個選項的意義定義如下:
c_cflag:
CLOCAL 本地模式,不改變埠的所有者
CREAD 表示使能數據接收器
PARENB 表示偶校驗
PARODD 表示奇校驗
CSTOPB 使用兩個停止位
CSIZE 對數據的bit使用掩碼
CS8 數據寬度是8bit
c_lflag:
ICANON 使能規范輸入,否則使用原始數據(本文使用)
ECHO 回送(echo)輸入數據
ECHOE 回送擦除字元
ISIG 使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信號
c_iflag:
IXON 使能輸出軟體控制
IXOFF 使能輸入軟體控制
IXANY 允許任何字元再次開啟數據流
INLCR 把字元NL(0A)映射到CR(0D)
IGNCR 忽略字元CR(0D)
ICRNL 把CR(0D)映射成字元NR(0A)
c_oflag: OPOST 輸出後處理,如果不設置表示原始數據(本文使用原始數據)
c_cc[VMIN]: 最少可讀數據
c_cc[VTIME]: 等待數據時間(10秒的倍數)
Ⅱ linux用中斷接收串口數據的原代碼!
以前寫的,但是沒寫完,偏偏你要的那部分沒寫。呵呵~~
先聲明,沒調試過。。僅供參考,有錯誤的地方請指正,謝謝!
////////////////////////
/******setport.h*******/
////////////////////////
#ifndef SETPORT_H
#define SETPORT_H
/*********************
int dwBaudRate; //波特率
char bTTY; //串口號
char bDataBit; //數據位 5,6,7,8
char bParity; //奇偶校驗 無校驗:'N' 偶校驗'E' 奇校驗'O'
char bStopBit; //停止位 1,2
char bFctl; //流控制 無控制:'N' 硬體控制:'H' 軟體控制:'S'
**********************/
//-------------------打開串口-------------------//bTTY==0,1,2,3, 對應串口Com1到Com4,成功返迴文件描述符,失敗==(-1)
extern int PortOpen(char bTTY);
//-------------------設置串口-------------------//成功==(0) 失敗==(-1)
extern int PortSet(int dwFdcom,int dwBaudRate,char bTTY,char bDataBit,char bParity,char bStopBit,char bFctl);
//-------------------關閉串口-------------------//
extern void PortClose(int dwFdcom);
//-------------------寫串口-------------------//成功返回datalen 失敗==(<0)
extern int PortWrite(int dwFdcom,char *cpSendBuf,unsigned int DataLen);
//-------------------讀串口-------------------//成功返回datalen 失敗==(-1)
extern int PortRead(int dwFdcom,char *cpRecvBuf,unsigned int DataLen,unsigned int dwBaudRate);
//-------------------超時設置-------------------//成功==0 失敗==(<0)
extern int PortTimeOut(int dwFdcom, char timeout, int len);
#endif
/////////////////////////////
/***********setport.c*******/
////////////////////////////
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <termios.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include "setport.h"
//-------------------打開串口-------------------//
extern int PortOpen(char bTTY)
{
int dwFdcom;
unsigned char Ptty[10]="/dev/ttyS";
unsigned char *cpGtty;
cpGtty=strcat(Ptty,&bTTY);
if(!cpGtty) return -1;
else {
dwFdcom=open(cpGtty,O_RDWR|O_NOCTTY);
}
return (dwFdcom);
}
//-------------------關閉串口-------------------//
extern void PortClose(int dwFdcom)
{
close(dwFdcom);
}
//-------------------設置串口-------------------//
extern int PortSet(int dwFdcom,int dwBaudRate,char bTTY,char bDataBit,char bParity,char bStopBit,char bFctl)
{
static int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300};
static int name_arr[] = {38400, 19200, 9600, 4800, 2400,1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300};
struct termios oldtm_t,newtm_t;
int i=0; char *pDatabit;
bzero(&oldtm_t,sizeof(oldtm_t));
bzero(&newtm_t,sizeof(newtm_t));
cfmakeraw(&newtm_t);
tcgetattr(dwFdcom,&oldtm_t);
/*------------設置埠屬性------------*/
for( ; i<sizeof(speed_arr)/sizeof(int) ; i++)
{
if(dwBaudRate==name_arr[i])
{
cfsetispeed(&newtm_t,speed_arr[i]);
cfsetospeed(&newtm_t,speed_arr[i]);
}
else return -1;
}
newtm_t.c_cflag|=CLOCAL;
newtm_t.c_cflag|=CREAD;
newtm_t.c_cflag &= ~CSIZE;
switch(bDataBit) //數據位
{
case '5':
newtm_t.c_cflag|=CS5;
break;
case '6':
newtm_t.c_cflag|=CS6;
break;
case '7':
newtm_t.c_cflag|=CS7;
break;
case '8':
newtm_t.c_cflag|=CS8;
break;
default:
return -2;
}
switch(bParity)
{
case 'N':{ //無校驗
newtm_t.c_cflag&=~PARENB;
newtm_t.c_iflag&= ~INPCK;
}break;
case 'O':{ //奇校驗
newtm_t.c_cflag |= (PARODD | PARENB);
newtm_t.c_iflag |= INPCK;
}break;
case 'E':{ //偶校驗
newtm_t.c_cflag |= PARENB;
newtm_t.c_cflag &= ~PARODD;
newtm_t.c_iflag |= INPCK;
}break;
default:
return -3;
}
//停止位
if(bStopBit=='2') newtm_t.c_cflag|=CSTOPB; //2
else newtm_t.c_cflag&=~CSTOPB; //1
switch(bFctl) //流控制
{
case 'N':{ //無控制
newtm_t.c_cflag &= ~CRTSCTS;
newtm_t.c_iflag &= ~(IXON | IXOFF | IXANY );
}break;
case 'H':{ //硬體控制
newtm_t.c_cflag |= CRTSCTS;
newtm_t.c_iflag &= ~(IXON | IXOFF | IXANY );
}break;
case 'S':{ //軟體控制
newtm_t.c_cflag &= ~CRTSCTS;
newtm_t.c_iflag |= (IXON | IXOFF | IXANY );
}break;
default:
return -4;
}
tcflush(dwFdcom,TCIFLUSH); //埠復位
tcsetattr(dwFdcom,TCSANOW,&newtm_t); //使埠屬性設置生效
return 0;
}
//-------------------超時設置-------------------//
extern int PortTimeOut(int dwFdcom, char timeout, int len)
{
struct termios newtm_t;
if(tcgetattr(dwFdcom, &newtm_t) != 0)
{
return (-1);
}
newtm_t.c_lflag &= ~ICANON;
newtm_t.c_cc[VTIME] = timeout;
newtm_t.c_cc[VMIN] = len;
if(tcsetattr(dwFdcom, TCSANOW, &newtm_t) != 0)
{
return (-2);
}
return 0;
}
////讀寫串口用文件讀寫方式,read和write兩個方法,
////read是接收數據,write是發送數據
Ⅲ 如何查看linux串口cts
在Linux環境下,串口名從ttyS0開始依次是ttyS1、ttyS2等。在本程序中,使用ttyS0作為通信串口。在打開ttyS0的時候,選項 O_NOCTTY 表示不能把本串口當成控制終端,否則用戶的鍵盤輸入信息將影響程序的執行; O_NDELAY表示打開串口的時候,程序並不關心另一端 的串口是否在使用中。在Linux中,打開串口設備和打開普通文件一樣,使用的是open()系統調用。比如我么打開串口設備1也就是COM1,只需要: fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY ); 打開的串口設備有很多設置選項。本文中使用int setup_com(int fd)設置。在系統頭文件<termios.h>中 定義了終端控制結構struct termios,tcgetattr()和tcsetattr()兩個系統函數獲得和設置這些屬性。結構 struct termios中的域描述的主要屬性包括: c_cflag : 控制選項 c_lflag : 線選項 c_iflag : 輸入選項 c_oflag :輸出選項 c_cc :控制字元 c_ispeed :輸入數據波特率 c_ospeed :輸出數據波特率 如果要設置某個選項,那麼就使用"|="運算,如果關閉某個選項就使用"&="和"~"運算。本文使用的各個選項的意義定義如下: c_cflag: CLOCAL 本地模式,不改變埠的所有者 CREAD 表示使能數據接收器 PARENB 表示偶校驗 PARODD 表示奇校驗 CSTOPB 使用兩個停止位 CSIZE 對數據的bit使用掩碼 CS8 數據寬度是8bit c_lflag: ICANON 使能規范輸入,否則使用原始數據(本文使用) ECHO 回送(echo)輸入數據 ECHOE 回送擦除字元 ISIG 使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信號 c_iflag: IXON 使能輸出軟體控制 IXOFF 使能輸入軟體控制 IXANY 允許任何字元再次開啟數據流 INLCR 把字元NL(0A)映射到CR(0D) IGNCR 忽略字元CR(0D) ICRNL 把CR(0D)映射成字元NR(0A) c_oflag: OPOST 輸出後處理,如果不設置表示原始數據(本文使用原始數據) c_cc[VMIN]: 最少可讀數據 c_cc[VTIME]: 等待數據時間(10秒的倍數) 根據以上設置的定義,串口埠設置函數setup_com()定義如下: int setup_com(int fd){ struct termios options; tcgetattr(fd, &options); /* Set the baud rates to 38400...*/ cfsetispeed(&options, B38400); cfsetospeed(&options, B38400); /* Enable the receiver and set local mode...*/ options.c_cflag |= (CLOCAL | CREAD); /* Set c_cflag options.*/ options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; /* Set c_iflag input options */ options.c_iflag &=~(IXON | IXOFF | IXANY); options.c_iflag &=~(INLCR | IGNCR | ICRNL); options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /* Set c_oflag output options */ options.c_oflag &= ~OPOST; /* Set the timeout options */ options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 10; tcsetattr(fd, TCSANOW, &options); return 1; } 6.7.2 設置串口通信參數 串口通信參數指的是波特率、數據位、奇偶校驗位和停止位。對串口實現控制的時候同樣要用到termio結構體。下面將結合具體的代碼說明如何設置這些參數。 1.波特率設置 獲得埠波特率信息是通過cfgetispeed函數和cfgetospeed函數來實現的。cfgetispeed函數用於獲得結構體 termios_p中的輸入波特率信息,而cfgetospeed函數用於獲得結構體termios_p 中的輸出波特率信息。這兩個函數的具體信息如表 6.9所示。 表6.9 cfgetispeed函數和cfgetospeed函數 頭文件 <termios.h> <unistd.h> 函數形式 speed_t cfgetispeed(const struct termios *termios_p); speed_t cfgetospeed(const struct termios *termios_p); 返回值 成功 失敗 是否設置errno 返回termios_p結構中的輸入/輸出埠的波特率 ?1 是 cfsetispeed函數和cfsetospeed函數用於設置埠的輸入/輸出波特率。一般情況下,輸入和輸出波特率是相等的。cfsetispeed函數和cfsetospeed函數的函數聲明信息如表6.10所示。 表6.10 cfsetispeed函數和cfsetospeed函數 頭文件 <termios.h> <unistd.h> 函數形式 int cfsetispeed(struct termios *termios_p, speed_t speed); int cfsetospeed(struct termios *termios_p, speed_t speed); 返回值 成功 失敗 是否設置errno 返回termios_p結構中的輸入/輸出埠的波特率 ?1 是 cfsetispeed函數和cfsetospeed函數會修改結構體termios_p中的波特率信息,其中參數speed可以使用表6.11中所列出的宏。 表6.11 speed參數常用波特率信息 宏 定 義 波特率(單位:bit/s) 宏 定 義 波特率(單位:bit/s) B0 0 B1800 1800 B50 50 B2400 2400 B75 75 B4800 4800 B110 110 B9600 9600 B134 134 B19200 19200 B150 150 B38400 38400 B200 200 B57600 57600 B300 300
Ⅳ 請問linux下串口向外發送數據要用什麼函數,代碼要怎麼寫謝謝
直接open就可以啦
FILE *fp = open(「/dev/ttyS0」, O_RDWR);
注/dev/ttyS*都是linux下串口的設備文件...直接讀寫就是收發數據...
別問我文件怎麼讀寫...
然後就可以write,read啦...記住一句話:一切都是文件。
Ⅳ linux串口通信代碼解釋,一句一句來
簡單說幾句吧,linux下的設備都是文件,流程也無非是open, read/write, close等
當然,串口你得設置各種屬性才行對不對,比如在win下的超級終端就設置了波特率啊,停止位啊,奇偶校驗啊什麼的,這些屬性都通過
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);函數來設置。
完整代碼嗎自己去google,一把一把的,其實最重要的是設置好屬性,剩下的就是read,write的問題咯。
希望對你有用
對了,了解終端函數的詳情請在linux命令行終端獲取: man termios
Ⅵ Linux 用C寫串口(modem)(急!)
是的,linux是linus
tovalds當時為了研究一個多用戶多任務操作系統,用c代碼編寫了一個很小的操作系統內核,他把這個源碼公布,大家都來修改它和發展它,最終發展成現在的linux操作系統.
Ⅶ linux下的串口編程
這有個友善的串口常式,參考下吧,用gcc編譯可以在linux下用
# include <stdio.h>
# include <stdlib.h>
# include <termio.h>
# include <unistd.h>
# include <fcntl.h>
# include <getopt.h>
# include <time.h>
# include <errno.h>
# include <string.h>
int CommFd, TtyFd;
static void Error(const char *Msg)
{
fprintf (stderr, "%s\n", Msg);
fprintf (stderr, "strerror() is %s\n", strerror(errno));
exit(1);
}
static void Warning(const char *Msg)
{
fprintf (stderr, "Warning: %s\n", Msg);
}
static int SerialSpeed(const char *SpeedString)
{
int SpeedNumber = atoi(SpeedString);
# define TestSpeed(Speed) if (SpeedNumber == Speed) return B##Speed
TestSpeed(1200);
TestSpeed(2400);
TestSpeed(4800);
TestSpeed(9600);
TestSpeed(19200);
TestSpeed(38400);
TestSpeed(57600);
TestSpeed(115200);
TestSpeed(230400);
Error("Bad speed");
return -1;
}
static void PrintUsage(void)
{
fprintf(stderr, "comtest - interactive program of comm port\n");
fprintf(stderr, "press [ESC] 3 times to quit\n\n");
fprintf(stderr, "Usage: comtest [-d device] [-t tty] [-s speed] [-7] [-c] [-x] [-o] [-h]\n");
fprintf(stderr, " -7 7 bit\n");
fprintf(stderr, " -x hex mode\n");
fprintf(stderr, " -o output to stdout too\n");
fprintf(stderr, " -c stdout output use color\n");
fprintf(stderr, " -h print this help\n");
exit(-1);
}
static inline void WaitFdWriteable(int Fd)
{
fd_set WriteSetFD;
FD_ZERO(&WriteSetFD);
FD_SET(Fd, &WriteSetFD);
if (select(Fd + 1, NULL, &WriteSetFD, NULL, NULL) < 0) {
Error(strerror(errno));
}
}
int sendUart(char c)
{
WaitFdWriteable(CommFd);
return write(CommFd, &c, 1);
}
char recUart()
{
char c='\0';
if (FD_ISSET(CommFd, &ReadSetFD))
{
if(read(CommFd, &c, 1) == 1) return c;
else printf("No data to receive.\n");
}
}
int main(int argc, char **argv)
{
struct termios TtyAttr;
struct termios BackupTtyAttr;
int DeviceSpeed = B115200;
int TtySpeed = B115200;
int ByteBits = CS8;
const char *DeviceName = "/dev/ttyS0";
const char *TtyName = "/dev/tty";
int OutputHex = 0;
int OutputToStdout = 0;
int UseColor = 0;
printf("Now we start.\n");
opterr = 0;
for (;;) {
int c = getopt(argc, argv, "d:s:t:7xoch");
if (c == -1)
break;
switch(c) {
case 'd':
DeviceName = optarg;
break;
case 't':
TtyName = optarg;
break;
case 's':
if (optarg[0] == 'd') {
DeviceSpeed = SerialSpeed(optarg + 1);
} else if (optarg[0] == 't') {
TtySpeed = SerialSpeed(optarg + 1);
} else
TtySpeed = DeviceSpeed = SerialSpeed(optarg);
break;
case 'o':
OutputToStdout = 1;
break;
case '7':
ByteBits = CS7;
break;
case 'x':
OutputHex = 1;
break;
case 'c':
UseColor = 1;
break;
case '?':
case 'h':
default:
PrintUsage();
}
}
if (optind != argc)
PrintUsage();
CommFd = open(DeviceName, O_RDWR, 0);
if (CommFd < 0)
Error("Unable to open device");
if (fcntl(CommFd, F_SETFL, O_NONBLOCK) < 0)
Error("Unable set to NONBLOCK mode");
memset(&TtyAttr, 0, sizeof(struct termios));
TtyAttr.c_iflag = IGNPAR;
TtyAttr.c_cflag = DeviceSpeed | HUPCL | ByteBits | CREAD | CLOCAL;
TtyAttr.c_cc[VMIN] = 1;
if (tcsetattr(CommFd, TCSANOW, &TtyAttr) < 0)
Warning("Unable to set comm port");
TtyFd = open(TtyName, O_RDWR | O_NDELAY, 0);
if (TtyFd < 0)
Error("Unable to open tty");
TtyAttr.c_cflag = TtySpeed | HUPCL | ByteBits | CREAD | CLOCAL;
if (tcgetattr(TtyFd, &BackupTtyAttr) < 0)
Error("Unable to get tty");
if (tcsetattr(TtyFd, TCSANOW, &TtyAttr) < 0)
Error("Unable to set tty");
for (;;) {
unsigned char Char = 0;
fd_set ReadSetFD;
void OutputStdChar(FILE *File) {
char Buffer[10];
int Len = sprintf(Buffer, OutputHex ? "%.2X " : "%c", Char);
fwrite(Buffer, 1, Len, File);
}
FD_ZERO(&ReadSetFD);
FD_SET(CommFd, &ReadSetFD);
FD_SET( TtyFd, &ReadSetFD);
# define max(x,y) ( ((x) >= (y)) ? (x) : (y) )
if (select(max(CommFd, TtyFd) + 1, &ReadSetFD, NULL, NULL, NULL) < 0) {
Error(strerror(errno));
}
# undef max
if (FD_ISSET(CommFd, &ReadSetFD)) {
while (read(CommFd, &Char, 1) == 1) {
WaitFdWriteable(TtyFd);
if (write(TtyFd, &Char, 1) < 0) {
Error(strerror(errno));
}
if (OutputToStdout) {
if (UseColor)
fwrite("\x1b[01;34m", 1, 8, stdout);
OutputStdChar(stdout);
if (UseColor)
fwrite("\x1b[00m", 1, 8, stdout);
fflush(stdout);
}
}
}
if (FD_ISSET(TtyFd, &ReadSetFD)) {
while (read(TtyFd, &Char, 1) == 1) {
static int EscKeyCount = 0;
WaitFdWriteable(CommFd);
if (write(CommFd, &Char, 1) < 0) {
Error(strerror(errno));
}
if (OutputToStdout) {
if (UseColor)
fwrite("\x1b[01;31m", 1, 8, stderr);
OutputStdChar(stderr);
if (UseColor)
fwrite("\x1b[00m", 1, 8, stderr);
fflush(stderr);
}
if (Char == '\x1b') {
EscKeyCount ++;
if (EscKeyCount >= 3)
goto ExitLabel;
} else
EscKeyCount = 0;
}
}
}
ExitLabel:
if (tcsetattr(TtyFd, TCSANOW, &BackupTtyAttr) < 0)
Error("Unable to set tty");
return 0;
}
Ⅷ 如何在LINUX下編寫一個C語言的串口程序
1、參考這個:POSIX操作系統串口編程指南和 UNIX環境高級編程。
2、簡單介紹一下:
《POSIX操作系統的串口編程指南》是在UNIX環境或PC上對串口進行編程的教程,每一章提供的常式都使用POSIX(Portable Standard for UNIX)終端控制函數,只需極少的修改就可運行在IRIX 、HP-UX、 SunOS、 Solaris、 Digital UNIX、 Linux等大多數類UNIX操作系統。
Ⅸ Linux C 配置串口
配置串口需要包含頭文件
其中最核心的配置結構體為:
如何獲取該結構呢?我們操作串口跟操作文件一樣,也是調用 open() 函數來打開串口,
這樣我們就能夠得到一個文件描述符 fd ,然後就可以調用 tcgetattr() 函數來獲取上述配置結構體了。
Linux 串口默認的配置為:波特率 9600,數據位 8 位,無奇偶校驗,停止位 1 位,無 CTS/RTS 。
以下介紹一些常用的配置項:波特率、奇偶校驗、數據位、停止位、硬體控制流。
相關介面:
Linux 將串口的波特率分為了輸入波特率和輸出波特率,不過最常用的場景是將兩者設置成一樣。
cfgetispeed() 函數獲取輸入波特率, cfgetospeed() 函數獲取輸出波特率。 cfsetispeed() 函數設置輸入波特率, cfsetospeed() 函數用於設置輸出波特率,當然 cfsetspeed() 函數擴展為同時設置輸入和輸出波特率。
上述介面中的 speed_t 是一系列波特率的標志位,例如常用的 115200 波特率就為 B115200,參考下述選項:
設置奇偶校驗位可以通過修改 termios 結構體中的 c_cflag 成員來實現,若無校驗,則將 PARENB 位設為 0;若有校驗,則 PARENB 為 1。之後再根據 PARODD 來區分奇偶校驗, PARODD 為 1 表示奇校驗, PARODD 為 0 表示偶校驗。例如設置無奇偶校驗位:
設置數據位可以通過修改 termios 結構體中的 c_cflag 成員來實現,CS5、CS6、CS7 和 CS8 分別代表數據位 5、6、7 和 8。不過在設置數據位之前,需要先用 CSIZE 來做屏蔽欄位,清楚這幾個標志位,例如設置數據位為 8 位:
設置停止位可以通過修改 termios 結構體中的 c_cflag 成員來實現, CSTOPB 位為 1 表示 2 位停止位, CSTOPB 位為 0 標志 1 位停止位。例如設置停止位為 1 位:
設置硬體控制流可以通過修改 termios 結構體中的 c_cflag 成員來實現, CRTSCTS 為 1 表示使用硬體控制流,為 0 表示不使用硬體控制流。例如使能硬體控制流:
當然,最後還需要用 tcflush() 拋棄存儲在 fd 里的未接收的數據。
再利用介面 tcsetattr() 函數將配置信息寫入文件描述符 fd :
這樣整個串口最常用的用法就配置完成了。
具體的配置使用可以參考我的項目 HCI-Middleware 里的 hci_transport_uart_linux.c 文件。
參考:
Ⅹ Linux下的串口通信C語言代碼和 Windows下的代碼一樣嗎
簡單說幾句吧,linux下的設備都是文件,流程也無非是open, read/write, close等
當然,串口你得設置各種屬性才行對不對,比如在win下的超級終端就設置了波特率啊,停止位啊,奇偶校驗啊什麼的,這些屬性都通過
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);函數來設置。
完整代碼嗎自己去google,一把一把的,其實最重要的是設置好屬性,剩下的就是read,write的問題咯。
希望對你有用
對了,了解終端函數的詳情請在linux命令行終端獲取: man termios