Linux下的串列埠程式設計(二)
Linxu下的串列埠程式設計(二)
/************宣告:本人只是見到這篇文章對我幫助很大才轉載的,但是這個完整的程式裡面本來有語法錯誤的,現在讓我改過來了************/
---------------------------------------------------------
Author :tiger-john
WebSite :blog.csdn.net/tigerjb
Update-Time : 2011年2月14日星期一
Tiger宣告:本人鄙視直接複製本人文章而不加出處的個人或團體,
但不排斥別人轉載tiger-john的文章,只是請您註明出處並和本人
聯絡或留言給我。3Q
---------------------------------------------------------
前面已經提到過Linux下皆為檔案,這當然也包括我們今天的主角àUART0串列埠。因此對他的一切操作都和檔案的操作一樣(涉及到了open,read,write,close等檔案的基本操作)。
一.Linux下的串列埠程式設計又那幾部分組成
1. 開啟串列埠
2. 串列埠初始化
3. 讀串列埠或寫串列埠
4. 關閉串列埠
二.串列埠的開啟
既然串列埠在linux中被看作了檔案,那麼在對檔案進行操作前先要對其進行開啟操作。
1.在Linxu中,串列埠裝置是通過串列埠終端裝置檔案來訪問的,即通過訪問/dev/ttyS0,/dev/ttyS1,/dev/ttyS2這些裝置檔案實現對串列埠的訪問。
2.呼叫open()函式來代開串列埠裝置,對於串列埠的開啟操作,必須使用O_NOCTTY引數。
l O_NOCTTY:表示開啟的是一個終端裝置,程式不會成為該埠的控制終端。如果不使用此標誌,任務一個輸入(eg:鍵盤中止訊號等)都將影響程序。
l O_NDELAY:表示不關心DCD訊號線所處的狀態(埠的另一端是否啟用或者停止)。
3.開啟串列埠模組有那及部分組成
1>呼叫open()函式開啟串列埠,獲取串列埠裝置檔案描述符
2>獲取串列埠狀態,判斷是否阻塞
3>測試開啟的檔案描述符是否為終端裝置
4程式:
/*****************************************************************
* 名稱: UART0_Open
* 功能: 開啟串列埠並返回串列埠裝置檔案描述
* 入口引數: fd :檔案描述符 port :串列埠號(ttyS0,ttyS1,ttyS2)
* 出口引數: 正確返回為1,錯誤返回為0
*****************************************************************/
int UART0_Open(int fd,char* port)
{
fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);
if (FALSE == fd)
{
perror("Can't Open Serial Port");
return(FASLE);
}
//判斷串列埠的狀態是否為阻塞狀態
if(fcntl(fd, F_SETFL, 0) < 0)
{
printf("fcntl failed!/n");
return(FALSE);
}
else
{
printf("fcntl=%d/n",fcntl(fd, F_SETFL,0));
}
//測試是否為終端裝置
if(0 == isatty(STDIN_FILENO))
{
printf("standard input is not a terminal device/n");
return(FALSE);
}
else
{
printf("isatty success!/n");
}
printf("fd->open=%d/n",fd);
return fd;
}
三.串列埠的初始化
1. 在linux中的串列埠初始化和前面的串列埠初始化一樣。需要設定串列埠波特率,資料流控制,幀的格式(即資料位個數,停止位,校驗位,資料流控制)
2. 串列埠初始化模組有那幾部分組成:
1>.設定波特率
2>設定資料流控制
2>設定幀的格式(即資料位個數,停止位,校驗位)
John哥說明:
1>設定串列埠引數時要用到termios結構體,因此先要通過函式
tcgettattr(fd,&options)獲得串列埠指向termios結構的指標。
2>通過cfsetispeed函式和cfsetospeed函式用來設定串列埠的輸入/輸出波特率。一般情況下,輸入和輸出波特率相等的。
3>設定資料位可以通過修改termios機構體中c_flag來實現。其中CS5,CS6,CS7,CS8對應資料位的5,6,7,8。在設定資料位時,必須要用CSIZE做位遮蔽。
4>資料流控制是使用何種方法來標誌資料傳輸的開始和結束。
5>在設定完波特率,資料流控制,資料位,校驗位,停止位,停止位後,還要設定最小等待時間和最小接收字元。
6>在完成配置後要通過tcsetattr()函式來啟用配置。
3.程式:
/*******************************************************************
* 名稱: UART0_Set
* 功能: 設定串列埠資料位,停止位和效驗位
* 入口引數: fd 串列埠檔案描述符
* speed 串列埠速度
* flow_ctrl 資料流控制
* databits 資料位 取值為 7 或者8
* stopbits 停止位 取值為 1 或者2
* parity 效驗型別 取值為N,E,O,,S
*出口引數: 正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
{
int i;
int status;
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 };
struct termios options;
/*tcgetattr(fd,&options)得到與fd指向物件的相關引數,並將它們保存於options,該函式,還可以測試配置是否正確,該串列埠是否可用等。若呼叫成功,函式返回值為0,若呼叫失敗,函式返回值為1.
*/
if ( tcgetattr( fd,&options) != 0)
{
perror("SetupSerial 1");
return(FALSE);
}
//設定串列埠輸入波特率和輸出波特率
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
cfsetispeed(&Options, speed_arr[i]);
cfsetospeed(&Options, speed_arr[i]);
}
}
//修改控制模式,保證程式不會佔用串列埠
options.c_cflag |= CLOCAL;
//修改控制模式,使得能夠從串列埠中讀取輸入資料
options.c_cflag |= CREAD;
//設定資料流控制
switch(flow_ctrl)
{
case 0 ://不使用流控制
options.c_cflag &= ~CRTSCTS;
break;
case 1 ://使用硬體流控制
options.c_cflag |= CRTSCTS;
break;
case 2 ://使用軟體流控制
options.c_cflag |= IXON | IXOFF | IXANY;
break;
}
//設定資料位
options.c_cflag &= ~CSIZE; //遮蔽其他標誌位
switch (databits)
{
case 5 :
options.c_cflag |= CS5;
break;
case 6 :
options.c_cflag |= CS6;
break;
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;
options.c_iflag &= ~INPCK;
break;
case 'o':
case 'O'://設定為奇校驗
options.c_cflag |= (PARODD | PARENB);
options.c_iflag |= INPCK;
break;
case 'e':
case 'E'://設定為偶校驗
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
options.c_iflag |= INPCK;
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);
}
//修改輸出模式,原始資料輸出
options.c_oflag &= ~OPOST;
//設定等待時間和最小接收字元
options.c_cc[VTIME] = 1; /* 讀取一個字元等待1*(1/10)s */
options.c_cc[VMIN] = 1; /* 讀取字元的最少個數為1 */
//如果發生資料溢位,接收資料,但是不再讀取
tcflush(fd,TCIFLUSH);
//啟用配置 (將修改後的termios資料設定到串列埠中)
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("com set error!/n");
return (FALSE);
}
return (TRUE);
}
/*******************************************************************
* 名稱: UART0_Init()
* 功能: 串列埠初始化
* 入口引數: fd 檔案描述符
* speed 串列埠速度
* flow_ctrl 資料流控制
* databits 資料位 取值為 7 或者8
* stopbits 停止位 取值為 1 或者2
* parity 效驗型別 取值為N,E,O,,S
* 出口引數: 正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Init(int fd, int speed,int flow_ctrlint databits,int stopbits,int parity)
{
int err;
//設定串列埠資料幀格式
if (UART0_Set(fd,115200,0,8,1,'N') == FALSE)
{
return FALSE;
}
else
{
return TRUE;
}
}
注:
如果不是開發終端之類的,只是串列埠傳輸資料,而不需要串列埠來處理,那麼使用原始模式(Raw Mode)方式來通訊,設定方式如下:
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /*Output*/
四. 串列埠的讀寫函式:
1. 讀寫串列埠是通過使用read函式和write函式來實現的。
2. 程式
/*******************************************************************
* 名稱: UART0_Recv
* 功能: 接收串列埠資料
* 入口引數: fd :檔案描述符
* rcv_buf :接收串列埠中資料存入rcv_buf緩衝區中
* data_len :一幀資料的長度
* 出口引數: 正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Recv(int fd, char *rcv_buf,int data_len)
{
int len,fs_sel;
fd_set fs_read;
struct timeval time;
FD_ZERO(&fs_read);
FD_SET(fd,&fs_read);
time.tv_sec = 10;
time.tv_usec = 0;
//使用select實現串列埠的多路通訊
fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
if(fs_sel)
{
len = read(fd,data,data_len);
return len;
}
else
{
return FALSE;
}
}
/*******************************************************************
* 名稱: UART0_Send
* 功能: 傳送資料
* 入口引數: fd :檔案描述符
* send_buf :存放串列埠傳送資料
* data_len :一幀資料的個數
* 出口引數: 正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Send(int fd, char *send_buf,int data_len)
{
int len = 0;
len = write(fd,send_buf,data_len);
if (len == data_len )
{
return len;
}
else
{
tcflush(fd,TCOFLUSH);
return FALSE;
}
}
五. 關閉串列埠
在完成對串列埠裝置的操作後,要呼叫close函式關閉該檔案描述符。
程式:
/******************************************************
* 名稱: UART0_Close
* 功能: 關閉串列埠並返回串列埠裝置檔案描述
* 入口引數: fd :檔案描述符
* 出口引數: void
*******************************************************************/
void UART0_Close(int fd)
{
close(fd);
}
一. 一個完整程式
/************************Copyright(c)*******************************
** 西安郵電學院
** graduate school
** XNMS專案組
** WebSite :blog.csdn.net/tigerjb
**------------------------------------------FileInfo-------------------------------------------------------
** File name: main.c
** Last modified Date: 2011-01-31
** Last Version: 1.0
** Descriptions:
**------------------------------------------------------------------------------------------------------
** Created by: 冀博
** Created date: 2011-01-31
** Version: 1.0
** Descriptions: The original version
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
*******************************************************************/
//串列埠相關的標頭檔案
#include<stdio.h> /*標準輸入輸出定義*/
#include<stdlib.h> /*標準函式庫定義*/
#include<unistd.h> /*Unix 標準函式定義*/
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h> /*檔案控制定義*/
#include<termios.h> /*PPSIX 終端控制定義*/
#include<errno.h> /*錯誤號定義*/
#include<string.h>
//巨集定義
#define FALSE -1
#define TRUE 0
/*******************************************************************
* 名稱: UART0_Open
* 功能: 開啟串列埠並返回串列埠裝置檔案描述
* 入口引數: fd :檔案描述符 port :串列埠號(ttyS0,ttyS1,ttyS2)
* 出口引數: 正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Open(int fd,char* port)
{
fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);
if (FALSE == fd)
{
perror("Can't Open Serial Port");
return(FALSE);
}
//恢復串列埠為阻塞狀態
if(fcntl(fd, F_SETFL, 0) < 0)
{
printf("fcntl failed!\n");
return(FALSE);
}
else
{
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
}
//測試是否為終端裝置
if(0 == isatty(STDIN_FILENO))
{
printf("standard input is not a terminal device\n");
return(FALSE);
}
else
{
printf("isatty success!\n");
}
printf("fd->open=%d\n",fd);
return fd;
}
/*******************************************************************
* 名稱: UART0_Close
* 功能: 關閉串列埠並返回串列埠裝置檔案描述
* 入口引數: fd :檔案描述符 port :串列埠號(ttyS0,ttyS1,ttyS2)
* 出口引數: void
*******************************************************************/
void UART0_Close(int fd)
{
close(fd);
}
/*******************************************************************
* 名稱: UART0_Set
* 功能: 設定串列埠資料位,停止位和效驗位
* 入口引數: fd 串列埠檔案描述符
* speed 串列埠速度
* flow_ctrl 資料流控制
* databits 資料位 取值為 7 或者8
* stopbits 停止位 取值為 1 或者2
* parity 效驗型別 取值為N,E,O,,S
*出口引數: 正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
{
int i;
int status;
int speed_arr[] = { B115200, B19200, B9600, B4800, B2400, B1200, B300};
int name_arr[] = {115200, 19200, 9600, 4800, 2400, 1200, 300};
struct termios options;
/*tcgetattr(fd,&options)得到與fd指向物件的相關引數,並將它們保存於options,該函式還可以測試配置是否正確,該串列埠是否可用等。若呼叫成功,函式返回值為0,若呼叫失敗,函式返回值為1.
*/
if ( tcgetattr( fd,&options) != 0)
{
perror("SetupSerial 1");
return(FALSE);
}
//設定串列埠輸入波特率和輸出波特率
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
cfsetispeed(&options, speed_arr[i]);
cfsetospeed(&options, speed_arr[i]);
}
}
//修改控制模式,保證程式不會佔用串列埠
options.c_cflag |= CLOCAL;
//修改控制模式,使得能夠從串列埠中讀取輸入資料
options.c_cflag |= CREAD;
//設定資料流控制
switch(flow_ctrl)
{
case 0 ://不使用流控制
options.c_cflag &= ~CRTSCTS;
break;
case 1 ://使用硬體流控制
options.c_cflag |= CRTSCTS;
break;
case 2 ://使用軟體流控制
options.c_cflag |= IXON | IXOFF | IXANY;
break;
}
//設定資料位
//遮蔽其他標誌位
options.c_cflag &= ~CSIZE;
switch (databits)
{
case 5 :
options.c_cflag |= CS5;
break;
case 6 :
options.c_cflag |= CS6;
break;
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;
options.c_iflag &= ~INPCK;
break;
case 'o':
case 'O'://設定為奇校驗
options.c_cflag |= (PARODD | PARENB);
options.c_iflag |= INPCK;
break;
case 'e':
case 'E'://設定為偶校驗
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
options.c_iflag |= INPCK;
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);
}
//修改輸出模式,原始資料輸出
options.c_oflag &= ~OPOST;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//我加的
//options.c_lflag &= ~(ISIG | ICANON);
//設定等待時間和最小接收字元
options.c_cc[VTIME] = 1; /* 讀取一個字元等待1*(1/10)s */
options.c_cc[VMIN] = 1; /* 讀取字元的最少個數為1 */
//如果發生資料溢位,接收資料,但是不再讀取 重新整理收到的資料但是不讀
tcflush(fd,TCIFLUSH);
//啟用配置 (將修改後的termios資料設定到串列埠中)
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("com set error!\n");
return (FALSE);
}
return (TRUE);
}
/*******************************************************************
* 名稱: UART0_Init()
* 功能: 串列埠初始化
* 入口引數: fd : 檔案描述符
* speed : 串列埠速度
* flow_ctrl 資料流控制
* databits 資料位 取值為 7 或者8
* stopbits 停止位 取值為 1 或者2
* parity 效驗型別 取值為N,E,O,,S
*
* 出口引數: 正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity)
{
int err;
//設定串列埠資料幀格式
if (UART0_Set(fd,19200,0,8,1,'N') == FALSE)
{
return FALSE;
}
else
{
return TRUE;
}
}
/*******************************************************************
* 名稱: UART0_Recv
* 功能: 接收串列埠資料
* 入口引數: fd :檔案描述符
* rcv_buf :接收串列埠中資料存入rcv_buf緩衝區中
* data_len :一幀資料的長度
* 出口引數: 正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Recv(int fd, char *rcv_buf,int data_len)
{
int len,fs_sel;
fd_set fs_read;
struct timeval time;
FD_ZERO(&fs_read);
FD_SET(fd,&fs_read);
time.tv_sec = 10;
time.tv_usec = 0;
//使用select實現串列埠的多路通訊
fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
if(fs_sel)
{
len = read(fd,rcv_buf,data_len);
printf("I am right!(version1.2) len = %d fs_sel = %d\n",len,fs_sel);
return len;
}
else
{
printf("Sorry,I am wrong!");
return FALSE;
}
}
/********************************************************************
* 名稱: UART0_Send
* 功能: 傳送資料
* 入口引數: fd :檔案描述符
* send_buf :存放串列埠傳送資料
* data_len :一幀資料的個數
* 出口引數: 正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Send(int fd, char *send_buf,int data_len)
{
int len = 0;
len = write(fd,send_buf,data_len);
if (len == data_len )
{
return len;
}
else
{
tcflush(fd,TCOFLUSH);
return FALSE;
}
}
int main(int argc, char **argv)
{
int fd; //檔案描述符
int err; //返回呼叫函式的狀態
int len;
int i;
char rcv_buf[100];
char send_buf[20]="tiger john";
if(argc != 3)
{
printf("Usage: %s /dev/ttySn 0(send data)/1 (receive data) \n",argv[0]);
return FALSE;
}
fd = UART0_Open(fd,argv[1]); //開啟串列埠,返回檔案描述符
do{
err = UART0_Init(fd,19200,0,8,1,'N');
printf("Set Port Exactly!\n");
}while(FALSE == err || FALSE == fd);
if(0 == strcmp(argv[2],"0"))
{
for(i = 0;i < 10;i++)
{
len = UART0_Send(fd,send_buf,10);
if(len > 0)
printf(" %d send data successful\n",i);
else
printf("send data failed!\n");
sleep(2);
}
UART0_Close(fd);
}
else
{
while (1) //迴圈讀取資料
{
len = UART0_Recv(fd, rcv_buf,9);
if(len > 0)
{
rcv_buf[len] = '\0';
printf("receive data is %s\n",rcv_buf);
printf("len = %d\n",len);
}
else
{
printf("cannot receive data\n");
}
sleep(2);
}
UART0_Close(fd);
}
}
/********************************************************************* End Of File **
*******************************************************************/
UART0串列埠程式設計目錄:
相關推薦
Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.net/w28252
Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.ne
Linux下的串列埠程式設計(二)
Linxu下的串列埠程式設計(二) /************宣告:本人只是見到這篇文章對我幫助很大才轉載的,但是這個完整的程式裡面本來有語法錯誤的,現在讓我改過來了************/ ---------------------------------------
Linux下串列埠程式設計總結
1.串列埠操作需要的標頭檔案 #include <stdio.h> //標準輸入輸出定義 #include <stdlib.h> //標準函式庫定義 #include <unistd.h> //Unix標準函式定義 #include <
Linux下串列埠程式設計基礎
串列埠知識 序列介面 (SerialInterface) 是指資料一位一位地順序傳送,其特點是通訊線路簡單,只要一對傳輸線就可以實現雙向通訊(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用於遠距離通訊,但傳送速度較慢。 1. 波特率
linux下串列埠程式設計設定函式---------set_opt(fd1,115200,8,'N'1)--------------------
open /dev/ttys0, 裝置檔案之後,得到檔案描述符, 對串列埠進行設定。 /** *串列埠設定函式:例(fd1, 115200, 8, 'N', 1); *引數: *fd:串列埠裝置節點
linux裝置驅動,tty串列埠程式設計 如何檢視linux下串列埠是否可用?串列埠名稱等
如何檢視linux下串列埠是否可用?串列埠名稱等? 檢視串列埠是否可用,可以對串列埠傳送資料比如對com1口,echo lyjie126 > /dev/ttyS0 檢視串列埠名稱使用 ls -l /dev/ttyS* 一般情況下串列埠的名稱全部在dev下面,如果你沒
Linux下串列埠通訊詳解(上)開啟串列埠和串列埠初始化詳解
linux下串列埠通訊主要有下面幾個步驟 串列埠通訊流程圖 下面我會一一介紹這幾個步驟。 1.開啟串列埠 程式碼(串列埠為ttyUSB0) //開啟串列埠 int open_port(void) { int fd; fd=open("/dev/ttyUSB0
Linux作業系統下串列埠程式設計入門教程
簡介: Linux作業系統從一開始就對序列口提供了很好的支援,本文就Linux下的序列口通訊程式設計進行簡單的介紹。 串列埠簡介 序列口是計算機一種常用的介面,具有連線線少,通訊簡單,得到廣泛的使用。常用的串列埠是RS-232-C介面(又稱EIA RS-232-
linux下安裝vsftp(二)
restart put pass con system 關閉 set acc cannot 安裝vsftpd 1、以管理員(root)身份執行以下命令 yum install vsftpd 2、設置開機啟動vsftpd ftp服務 chkconfig vsftpd
AliOS-Things--ESP8266-linkkitapp-串列埠(二)
/* * Copyright (C) 2015-2017 Alibaba Group Holding Limited * * * this is a uart sample from hal uart for esp8266, and the same as other
Linux C++串列埠程式設計 ROS
串列埠簡介 序列介面(Serial port)又稱“序列埠”,主要用於序列式逐位資料傳輸。常見的有一般計算機應用的
解決Linux下串列埠資料接收不全的異常問題
1、引言 最近在Linux下除錯串列埠程式,遇到了串列埠資料接收不全的異常問題,經過將近一上午的努力終於找到問題根源,特此分享給大家,此次除錯過程中用到了主要用到了minicom工具,至於minicom的使用大家可以自行查詢相關資料。 2、正文
記一次linux下串列埠資料丟包解決過程
專案中兩個晶片之間用串列埠進行通訊,由於傳輸格式中有校驗位,在資料量很大的時候總是校驗失敗。於是花了很長的時間最終解決了這個問題。 首先串列埠丟資料有兩種情況(明顯排除傳送端傳送的資料不對),第一種是通道也就是串列埠線或者連線口不行,無法承受很高的波特率(我使用的波特率是9
Linux下開發stm32(二) | 使用openocd下載程式
1.openocd介紹 openocd全名叫做Open On-Chip Debugger,是一個自由開放的片上除錯工具和程式設計工具,目前已經發布到0.10.0版本,目前主流偵錯程式幾乎都支援,具體可以檢視Open On-Chip Debugger:OpenOCD User’s Guid
linux 下串列埠工具minicom的使用
為了在ubuntu 12.04下能夠看到正常串列埠輸出,使用Minicom. 1、安裝 sudo apt-get install minicom 2、配置 (1)首先在命令列下執行sudo minicom啟動程式 (2)進入主介面後按 Ctrl+A 然後再按Z 進入配
linux下串列埠除錯工具/串列埠終端推薦: picocom
對於picocom, kermit, minicom, picocom 最簡單易用,也完全符合我的使用需求。 安裝(mint / ubuntu):$ sudo apt-get install picocom使用:$ picocom -b 115200 /dev/ttyUSB
嵌入式Linux下串列埠除錯
By Toradex秦海 1). 簡介 UART串列埠是嵌入式裝置最為常用的除錯和通訊介面之一,無論是RS232還是RS422/485都有著非常廣泛的應用,因此本文就基於嵌入式Linux演示在User Space進行串列埠除錯。 本文所演示的平臺來自於Toradex Co
linux下串列埠非標準波特率的實現
最近要在linux下使用電腦的串列埠,而使用的波特率不是諸如9600,19200之類的標準波特率,從網上查詢非標準波特率的設定方法,都是說對termios結構體進行設定。按照網上的程式碼進行設定卻不成功。費了很大力氣終於找到了原因:原來我的linux版本支援一部分非標準的
Cutecom--Linux下串列埠除錯工具
Cutecom是一款在Linux環境下,非常好用的串列埠除錯工具,使用方法幾乎跟Windows下的串列埠除錯工具一樣,非常方便。 Cutecom的安裝:直接在終端輸入:sudo apt-get install cutecom。 安裝完後,使用命令:sudo cutecom開
linux下串列埠工具minicom使用
系統環境:ubuntu destop 11.10 我當時的需要主要是兩個,能夠看到正常串列埠輸出,並且把串列埠內容實時輸出到檔案中 那接下來工作主要是兩個:1、安裝 2、配置 相信各位也都是至少會操作一些全令行的,我們在這裡用apt-get安裝(不會的同學請google一