1.使用ls -l ttyS*命令顯示如下

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比南通網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式南通網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋南通地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。
crw-rw----. 1 root dialout 4, 64 5月 17 02:24 /dev/ttyS0
crw-rw----. 1 root dialout 4, 65 5月 17 02:24 /dev/ttyS1
crw-rw----. 1 root dialout 4, 66 5月 17 02:24 /dev/ttyS2
crw-rw----. 1 root dialout 4, 67 5月 17 02:24 /dev/ttyS3
但你不知到哪個是真實的串口,雖然一般都是ttyS0,但也不敢妄然確定。
2.使用cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:0 rx:0
1: uart:unknown port:000002F8 irq:3
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
我們發(fā)現(xiàn)串口0的uart值時16550A,tx值為0,rx值也為0,因此我們斷定本機只有一個串口,是串口0,即ttyS0
3.也可以用dmesg | grep ttyS*,但這個不是很好用,當然你可以自己使用正則法則取找到。
注意:還應查看是否有USB轉(zhuǎn)串口,這個就很簡單了:ls ttyUSB*,全部搞定。
#includestdio.h
#includestdlib.h
#includeunistd.h
#includesys/types.h
#includesys/stat.h
#includefcntl.h
#includetermios.h
#includeerrno.h
#define?FALSE?-1
#define?TRUE?0
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,?};
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);??
if??(status?!=?0)?{????????
perror("tcsetattr?fd1");??
return;?????
}????
tcflush(fd,TCIOFLUSH);???
}??
}
}
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;
break;???
default:????
fprintf(stderr,"Unsupported?data?size\n");?return?(FALSE);??
}
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);?
options.c_iflag?|=?INPCK;?????????????/*?Disnable?parity?checking?*/?
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':??/*as?no?parity*/???
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;?
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME]?=?150;?
options.c_cc[VMIN]?=?0;?/*?Update?the?options?and?do?it?NOW?*/
if?(tcsetattr(fd,TCSANOW,options)?!=?0)???
{?
perror("SetupSerial?3");???
return?(FALSE);??
}?
return?(TRUE);??
}
int?main()
{
printf("This?program?updates?last?time?at?%s???%s\n",__TIME__,__DATE__);
printf("STDIO?COM1\n");
int?fd;
fd?=?open("/dev/ttyS0",O_RDWR);
if(fd?==?-1)
{
perror("serialport?error\n");
}
else
{
printf("open?");
printf("%s",ttyname(fd));
printf("?succesfully\n");
}
set_speed(fd,115200);
if?(set_Parity(fd,8,1,'N')?==?FALSE)??{
printf("Set?Parity?Error\n");
exit?(0);
}
char?buf[]?=?"fe55aa07bc010203040506073d";
write(fd,buf,26);
char?buff[512];
int?nread;
while(1)
{
if((nread?=?read(fd,?buff,?512))0)
{
printf("\nLen:?%d\n",nread);
buff[nread+1]?=?'\0';
printf("%s",buff);
}
}
close(fd);
return?0;
}
簡單的運行 dmesg 命令
$ dmesg | grep tty
輸出:
[ 37.531286] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.531841] 00:0b: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.532138] 0000:04:00.3: ttyS1 at I/O 0x1020 (irq = 18) is a 16550A
setserial 命令
setserial 是一個程序用于設定并/或報告某個串口關聯(lián)的配置信息。該信息包括串口用到的I/O 端口和中斷號,以及Break鍵是否應被解釋為Secure Attention Key 等等。 僅僅是輸出如下的命令:
$ setserial -g /dev/ttyS[0123]
輸出:
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x1020, IRQ: 18
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
帶-g選項的setserial幫助找到你的Linux板子上的物理串口。
Linux 串口控制臺程序
一旦串口被確定了,你就能使用許多的工具來配置Linux板子:
minicom- 用于控制modem和連接到dump 設備的最好的串口通信程序。
wvidial or other GUI dial up networking program - 一個內(nèi)建智能PPP 撥號器。
getty / agetty - agetty 打開一個 tty 端口, 提示登錄名稱并調(diào)用 /bin/login 命令。
grub / lilo configuration - 配置串口為系統(tǒng)控制臺。
將USB串口設備插入USB口后,會在/dev/目錄下生成/dev/ttyUSB0文件(也可能為/dev/ttyUSB1,/dev/ttyUSB2...),
查看此文件
輸出為:
c說明表明設備為字符設備文件(d表示目錄文件,-表示普通文件,l表示鏈接文件,b表示塊文件),
其中rw-rw----表示root用戶作為文件所有者可以讀和寫,dialout用戶組內(nèi)的用戶可以讀和寫,其他用戶不允許讀、寫和執(zhí)行(r表示可讀,w表示可寫,x表示可執(zhí)行)
因此,需要將當前用戶增加到dialout用戶組中
網(wǎng)站名稱:linux命令行讀串口,linux串口讀取命令
文章來源:http://chinadenli.net/article44/dsgsshe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、網(wǎng)站收錄、服務器托管、外貿(mào)建站、定制網(wǎng)站、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)