linux串列埠除錯

2021-05-31 23:13:47 字數 4285 閱讀 9291

在第一次除錯linux串列埠驅動的時候,一定要保證與linux串列埠通訊的器件是沒有問題可以使用的,然後我們再進行串列埠操作的學習,否則也許可能碰到問題的時候不知如何處理了。

好了,在保證硬體已經沒有問題的情況下,我們開始學習串列埠驅動模組的使用。

pc上的串列埠不比嵌入式,你可以在了解了暫存器之後操作暫存器就可以實現串列埠的功能了。

pc都是基於作業系統的,作業系統在使用者模式是不能隨便操作硬體,只有使用者將核心模組載入,讓核心模組去操作硬體,在linux下就是使用這樣的方式操作模組的。

在linux下目錄/dev/ 下就是一些硬體的驅動模組,對應串列埠的是名稱為ttys(數字)的模組,比如ttys0就是串列埠1(com1),ttys1就是串列埠2,以此類推。

linux下對硬體的操作就像是對檔案的操作一樣,唯一的區別就是檔案不是流操作,可以在檔案內部來回移動,串列埠以及其他硬體都是流操作,讀取過了的資料是沒有辦法恢復的。

在了解了這些之後,我們開始學習串列埠的訪問函式。

首先我們從頭檔案開始:

#include //標準輸入輸出定義

#include //字串功能定義

#include //unix標準函式定義

#include //檔案控制定義

#include //錯誤碼定義

#include //posix終端控制定義

#include //exit函式

#include //時間函式

#include //pid_t 多執行緒

#include //ioctl

以上就是我們串列埠除錯所用到的所有標頭檔案,當然很多標頭檔案應該用不上,但是我們一次性包含進來,用的時候就不用那樣的找了。

下面是串列埠的開啟操作:

串列埠開啟用 open 函式,具體為:

fd = open("/dev/ttys0", o_rdwr | o_noctty | o_ndelay);

這個函式返回-1就表示開啟錯誤,有可能是被占用。後門的標誌位o_rdwr 表示讀寫,o_noctty表示改程式不會成為此程式的控制終端,與o_ndelay,表示不等的dcd訊號,一直處於等待資料接收狀態。

在開啟成功後,在最後新增函式 fcntl(fd, f_setfl, 0);表示執行read命令的時候,如果沒有資料會阻塞程序。

串列埠關閉操作,

串列埠關閉使用close函式,

close(fd); 即可關閉,沒有返回值。

串列埠寫資料使用write函式

write(fd,w_buf,n)

串列埠讀操作使用read函式

len=read(fd,w_buf,n)

如果串列埠設定fcntl(fd,f_setfl,fndelay);

read函式將不會阻塞,如果沒有資料將會直接返回0

在我們知道如何操作串列埠之後,我們只能操作乙個適合我們使用的串列埠,

串列埠屬性的設定就是我們首先要解決的問題了。

1 波特率

2400        b2400

4800        b4800

9600        b9600

19200      b19200

38400      b38400

57600       b57600

115200    b115200

其中9600是預設波特率,用的比較多,arm晶元使用的波特率比較高,是115200。

設定波特率使用函式cfsetispped和cfsetospeed設定輸入波特率和輸出波特率,一般情況下我們使用的輸入和輸出都是同乙個波特率。

2 設定控制模式

設定流控制:

不使用流控制:termios_new.c_cflag &= ~crtscts

使用硬體流控:termios_new.c_cflag |= crtscts

使用軟體流控:termios_new.c_iflag |= ixon | ixoff | ixany

設定字元大小:

termios_new.c_cflag &= ~csize;

termios_new.c_cflag |= cs8;

termios_new.c_cflag |= cs7;

termios_new.c_cflag |= cs6;

termios_new.c_cflag |= c5;

設定奇偶校驗:

無校驗:termios_new.c_cflag &= ~parenb;

奇校驗:termios_new.c_cflag |= parenb;

termios_new.c_cflag &= ~parodd;

偶校驗:termios_new.c_cflag |= parenb;

termios_new.c_cflag |= parodd;

以上就是串列埠通訊的一些基礎知識。

下面開始看程式:

mycom.h

typedef struct

portinfo_t;

typedef portinfo_t *pportinfo_t;

int portopen(pportinfo_t pportinfo);

int portset(int fdcom,const pportinfo_t pportinfo);

void portclose(int fdcom);

int portsend(int fdcom, char *data, int datalen);

int portrecv(int fdcom, char *data, int datalen, int baudrate);

mycom.c

/*mycom.c

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "mycom.h"

#define tty_dev "/dev/ttys"

#define timeout_sec(buflen,baud) (buflen*20/baud+2)

#define timeout_usec 0

char *get_ptty(pportinfo_t pportinfo)

break;

case '1':

break;

case '2':

break;

}return ptty;

}int convbaud(unsigned long int baudrate)

}int portset(int fdcom, const pportinfo_t pportinfo)

termios_new.c_cflag &= ~csize;

databit = pportinfo->databit;

switch(databit)

parity = pportinfo->parity;

switch(parity)

stopbit = pportinfo->stopbit;

if(stopbit == '2')

else

termios_new.c_oflag &= ~opost;

termios_new.c_cc[vmin] = 1;

termios_new.c_cc[vtime] = 1;

tcflush(fdcom, tciflush);

tmp = tcsetattr(fdcom, tcsanow, &termios_new);

tcgetattr(fdcom, &termios_old);

return tmp;

}int portopen(pportinfo_t pportinfo)

void portclose(int fdcom)

int portsend(int fdcom, char *data, int datalen)

else

}int portrecv(int fdcom, char *data, int datalen, int baudrate)

else

}主函式:

int main(int argc, char *argv)

; if(argc != 2)

fdcom = portopen(&portinfo);

if(fdcom<0)

portset(fdcom, &portinfo);

if(atoi(argv[1])==0)

else

sleep(1);

}portclose(fdcom);

}else

Linux串列埠除錯

在第一次除錯linux串列埠驅動的時候,一定要保證與linux串列埠通訊的器件是沒有問題可以使用的,然後我們再進行串列埠操作的學習,否則也許可能碰到問 題的時候不知如何處理了。好了,在保證硬體已經沒有問題的情況下,我們開始學習串列埠驅動模組的使用。pc上的串列埠不比嵌入式,你可以在了解了暫存器之後操...

linux下串列埠除錯工具

之前公司訂購了幾台裝置,剛開始接觸串列埠的時候,對串列埠了解太少,以下是在使用過程中用到的串列埠除錯命令和方法 1.除錯串列埠首先要用串列埠命令測試串列埠指示燈亮不亮,在linux下使用的命令如下 stty f dev ttys0 a 說明哈 dev ttys0 是你要除錯的那個串列埠的裝置名稱有很...

linux串列埠命令列除錯

測試傳送 echo 123456 dev ttys1 測試接收 busybox microcom s 115200 dev ttys1 引數 s 波特率 t 超時退出時間 不加 t就是一直等待接收 例如 1.將arm機器的串列埠1接電腦 電腦開個串列埠工具設定波特率115200 2.busybox ...