linux關閉串口
1. 串口設置問題,在linux系統中
如果要設置某個選項,那麼就使用"|="運算,如果關閉某個選項就使用"&="和"~"運算。
當你單個賦值的時候,首先要把當前的設置獲取到,然後再進行或運算。
不知道你的是不是這個問題,你也沒有把代碼搞過來
2. linux怎麼鎖住串口,禁止其他程序使用,即禁止其他程序進行讀寫操作,即使是root用戶也不允許讀
應該是沒有這樣的辦法的。
linux系統基本上不會禁止root的許可權,即使你想辦法禁止了,也有辦法打開,除非那不是真正的root。
你應該換一個思路來解決你的問題。比如除了你的程序,沒有其他程序運行在這台電腦上,沒有其他用戶有權訪問這台電腦,不就解決了嗎?
3. linux串口測試
串列埠是系統資源的一部分,其本質是作為CPU和串列設備間的編碼轉換器。當數據從 CPU經過串列埠發送出去時,位元組數據轉換為串列的位(Bit); 接收數據時,串列的位被轉換為位元組數據。應用程序要使用串口進行通信,必須在使用之前向操作系統提出資源申請要求(即打開串口),通信完成後再釋放資源(即關閉串口)。
所以是要經過CPU的
4. linux中有沒有替代windows串口編程中SetCommBreak()與ClearCommBreak()
(一)Windows API串口通信編程概述
Windows環境下的串口編程與DOS環境下的串口編程有很大不同。Windows環境下的編程的最大特徵之一就是設備無關性,它通過設備驅動程序將Windows應用程序同不同的外部設備隔離。Windows封裝了Windows的通信機制,這種方式稱為通信API,Windows程序可以利用Windows通信API進行編程,不用對硬體直接進行操作。這種體系被稱為Windows開放式服務體系(WOSA,Windows Open Services Architectures)。
早期的Windows3.x與Windows 9x/NT/2000的通信API有很大不同,在16位的串列通信程序中,一般使用16位的Windows API通信函數。為使大家對串口通信有一全面的理解,下面簡單介紹一下16位的Windows API通信函數:
(1) 打開和關閉串口
OpenComm()打開串口資源,並指定輸入、輸出緩沖區的大小(以位元組計);
CloseComm()關閉串口;
例:
int idComDev;
idComdev=OpenComm(「COM1」,1024,512);
CloseComm(idComDev);
(2) 初始化串口
BuildCommDCB()、setCommState()填寫設備控制塊DCB,然後對已打開的串口進行參數配置,例:
DCB dcb;
BuildCommDCB(〝COM1:2400,n,8,1〞,&dcb);
SetCommState(&dcb);
(3) 對串口進行讀寫
ReadComm、WriteComm()對串口進行讀寫操作,即數據的接收和發送。例:
char *m_pReceive; int count;
ReadComm(idComDev,m_pReceive,count);
Char wr[30]; int count2;
WriteComm(idComDev,wr,count2);
通過對以上的描述我們可以看出,16位以下的串口通信程序最大的特點就在於串口等外部設備的操作有自己特有的API函數。
Windows 9x/NT/2000中的API一般都支持32位的操作,因此又稱為Win32API。為了在上述系統中實現串列數據傳送,可以使用Win32通信API。Win32通信API基本上是一個串列埠API,不是很適合於區域網(LAN)通信。雖然在線路上發送數據之前,LAN通常將數據位串列化,這和窗口或數據機發送數據之前所作的工作一模一樣,但區域網使用的線路的位數通常比串口少,而且還使用與串口協議很少有類似之處的訪問、路由、安全性和糾錯協議。區域網通信所需要的協議層使得Win32通信API對於這些應用來說很不理想。因此,在網路通信和連接方面,TCP/IP協議要比Win32通信API更適合一些。
Windows操作系統是一個可搶占式的操作系統,所以Windows應用程序常常有被別的程序搶占時間片的可能,因此Win32通信API也不能用於實時通信。實時通信的質量與時間密切相關。例如,數字化音頻數據是實時數據,因為話音的質量依賴於播放它的速率。在錄制音頻時,它就以某個速度被數字化了,該速度就是人們所熟知的采樣速率。聲音必須以相同的采樣率重放,否則聽起來就會太慢或太快。實際中的視頻播放,也不是實時播放,那僅僅是存放在緩沖中的那部分數據。因此,不需要許多協議層的互動式、非實時的通信可以採用Win32通信API來實現。Win32通信API把串口操作(以及並口等)和文件操作統一起來了,使用類似的操作來實現。
(二) Windows串口通信相關API函數
「工欲善其事,必先利其器」,這一節將從使用的角度出發,對和串口通信相關的32位的Windows API函數進行介紹,力圖使你們對其有個全面、准確的認識。
2.1 打開和關閉串口
1. 打開串口
在32位的Windows系統中,串口和其它通信設備是作為文件處理的。串口的打開、關閉、讀取和寫入所用的函數與操作文件的函數完全一致。
通信會話以調用CreateFile()開始。CreateFile()為讀訪問、寫訪問或讀寫訪問「打開」串口。按照Windows的通常做法,CreateFile()返回一個句柄,隨後在打開的埠的操作中使用CreateFile()函數非常復雜,復雜性的原因之一是它是通用的。可以使用CreateFile打開已存在的文件,創建新文件和打開根本就不是文件的設備,例如串口、並口和數據機。CreateFile()函數聲明如下:
HANDLE CreateFile(
LPCTSTR lpszName,
DWORD fdwAccess,
DWORD fdwShareMode,
LPSECURITY_ATTRIBUTES lpsa,
DWORD fdwCreate,
DWORD fdwAttrsAndFlags,
HANDLE hTemplateFile
)
CreateFile函數中的參數解釋如下:
·lpszName:指定要打開的串口邏輯名,用字元串表示,如「COM1」和「COM2」分別表示串口1和串口2。
·fdwAccess:用來指定串口訪問的類型。與文件一樣,串口也是可以被打開以供讀取、寫入或者兩者兼有。
GENERIC_READ位讀取訪問打開埠,GENERIC_READ位寫訪問打開埠。這兩個常數定義如下:
const GENERIC_READ = 0x80000000h;
const GENERIC_WRITE = 0x40000000h;
用戶可以用邏輯操作將這兩個標識符連接起來,為讀/寫訪問許可權打開埠。因為大部分串口通信都是雙向的,因此常常在設置中將兩個標識符連接起來使用。如:
fdwAccess = GENERIC_READ | GENERIC_WRITE;
·fdwShareMode:指定該埠的共享屬性。該參數是為那些由許多應用程序共享的文件提供的。對於不能共享的串口,它必須設置為0。這就是文件與通信設備之間的主要差異之一。如果在當前的應用程序調用CreateFile()時,另一個應用程序已經打開了串口,該函數就會返回錯誤代碼,原因是兩個應用程序不能共享一個埠。然而,同一個應用程序的多個線程可以共享由CreateFile()返回的埠句柄,並且根據安全性屬性設置,該句柄可以被打開埠的應用程序的子程序所繼承。
·Ipsa:引用安全性屬性結構(SECURITY_ARRTIBUTES),該結構定義了一些屬性,例如通信句柄如何被打開埠的應用程序的子程序所繼承。將該參數設置為NULL將為該埠分配預設的安全性屬性。子應用程序所繼承的預設屬性是該埠不能被繼承的。
安全屬性結構SECURITY_ARRTIBUTES結構聲明如下:
typedef struct_SECURITY_ARRTIBUTE {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ARRTIBUTE;
SECURITY_ARRTIBUTES結構成員nLength指明該結構的長度,lpSecurityDescriptor指向一個安全描述字元,bInheritHandle表明句柄是否能被繼承。
·fdwCreate:指定如果CreateFile()正在被已有的文件調用時應採取的動作。因為串口總是存在,fdwCreate必須設置成OPEN_EXISTING。該標志告訴Windows不用企圖創建新埠,而是打開已經存在的埠。OPEN_EXISTING常數定義為:
const OPEN_EXISTING = 3;
·fdwAttrsAndFlags:描述了埠的各種屬性。對於文件來說,有可能具有很多屬性,但對於串口,唯一有意義的設置是FILE_FLAG_OVERLAPPED。當創建時指定該設置,埠I/O可以在後台進行(後台I/O也叫非同步I/O)。FILE_FLAG_OVERLAPPED常數定義如下:
const FILE_FLAG_OVERLAPPED = 0x40000000h
·hTemplateFile:指向模板文件的句柄,當埠處於打開狀態時,不使用該參數,因而必須置成0。
調用CreateFile()函數打開COM1串口操作的例子如下所示:
HANDLE hCom;
DWORD dwError;
hCom=CreateFile(「COM1」, // 文件名
GENERIC_READ | GENERIC_WRITE, // 允許讀和寫
0, // 獨占方式
NULL,
OPEN_EXISTING, // 打開而不是創建
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // 重疊方式
NULL
);
if(hCom = = INVALID_HANDLE_VALUE)
{
dwError=GetLastError(); // 處理錯誤
}
一旦埠處於打開狀態,就可以分配一個發送緩沖區和接收緩沖區,並且通過調用SetupComm()實現其它初始化工作。也可以不調用SetupComm()函數,Windows系統也會分配預設的發送和接收緩沖區,並且初始化埠。但為了保證緩沖區的大小與實際需要的一致,最好還是調用該函數。SetupComm()函數聲明如下:
BOOL SetupComm(
HANDLE hFile, // 通信設備句柄
DWORD dwInQueue, // 輸入緩沖區大小
DWORD dwOutQueue // 輸出緩沖區大小
);
SetupComm()函數中各項含義說明如下:
·hFile: 由GreatFile()返回的指向已打開埠的句柄。
·dwInQueue和dwOutQueue: 接收緩沖區的大小和發送緩沖區的大小。這兩個定義並非是實際的緩沖區的大小,指定的大小僅僅是「推薦的」大小,而Windows可以隨意分配任意大小的緩沖區。Windows設備驅動程序可以獲得這兩個數據,並不直接分配大小,而使用來優化性能和避免緩沖區超限。
注意:當使用CreateFile()函數打開串口時:為實現數據機的排他性訪問,共享標識必須設為零;創建標識必須設為OPEN_EXISTING;模板句柄必須置為空。
2. 關閉串口
關閉串口比打開串口簡單得多,只需要調用CloseHandle()函數關閉由CreateHandle()函數返回得句柄即可。
CloseHandle函數聲明如下:
BOOL CloseHandle(
HANDLE hObject // 需關閉的設備句柄
);
使用串口時一般要關閉它,如果忘記關閉串口,串口就會始終處於打開狀態,其它應用程序就不能打開並使用串口了。
附上出處鏈接:http://blog.csdn.net/nocodelife/article/details/8594073
5. Linux串口怎麼清空
tcflush函數清除串口輸入緩存(終端驅動已接到,但用戶尚未讀取)或串口輸出緩存(用戶已經寫如緩存,但尚未發送)。
函數原型:
int tcflush(int filedes,int quene)
參數解釋
filedes: 描述符。
quene取值及含義:
*TCIFLUSH 清除輸入隊列
*TCOFLUSH 清除輸出隊列
*TCIOFLUSH 清除輸入、輸出隊列
舉例:tcflush(fd,TCIOFLUSH);
6. Linux下對串口操作的方法
和文件一樣,open /dev/ttyS0就是串口1 然後設置波特率,停止位 奇偶校驗那些 ,之後read write就可以了 頭文件是<termios.h>
7. Linux怎麼把串口設置
簡單的運行 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 是一個程序用於設定並/或報告某個串口關聯的配置信息。該信息包括串口用到的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和連接到mp 設備的最好的串口通信程序。
wvidial or other GUI dial up networking program - 一個內建智能PPP 撥號器。
getty / agetty - agetty 打開一個 tty 埠, 提示登錄名稱並調用 /bin/login 命令。
grub / lilo configuration - 配置串口為系統控制台。
8. 如何禁止linux串口輸出調試信息,作為通訊串口。
netstat -tln 開放服務的同時,埠就開啟了。 比如你開啟了ssh服務,那麼22埠就自動開啟le
9. linux啟動的log能關掉或者不在串口顯示嗎
1.准備
串口線一條、手機一個
2.步驟
1將串口線插入電腦USB口,開啟另一個終端查看串口設備名,輸入下面命令:
dmesg
2找到最下面一行,尾部即是串口設備名稱,我這里叫做「ttyUSB0」
3然後安裝串口抓取軟體,進入Ubuntu軟體中心,搜索CuteCom,點擊安裝即可。
4運行CuteCom,需要root許可權,所以通過終端來進行
sudo cutecom
打開後的界面如下:
5在上圖位置1,填入/dev/ttyUSB0,位置2選最大參數921600
6准備工作就完畢了,點擊Open device按鈕,工具開始等待設備接入
7將手機連上串口線,點擊開機按鈕,位置3中就會將串口log列印出來
8如果需要保存,可以勾選位置4,點擊後面的「…」按鈕可以選擇存儲路徑。也可以直接在位置3通過復制粘貼操作進行。
3.注意事項
有些手機的串口log是沒有打開的,那麼就無法抓取得到。串口log一般都在開機後不再輸出(影響性能),因此常用於分析開機log。
10. LINUX和開發版 串口程序編寫問題
while (STOP==FALSE)
{
//在此處補充填寫代碼?實現讀取串口數據、並將數據在標准終端上寫出來
if(read(fd, data, ENDMINITERM)==0)
return data;
}
while (STOP==FALSE)
{
c++;
c %= 255;
//在此處補充填寫代碼?實現寫入串口數據
if(write(fd, data, ENDMINITERM) < 0)
exit(1);
usleep(1000000);
}
//在此處補充填寫代碼?實現打開串口1的功能
fd = open(COM1,O_RDWR);
if(fd < 0)
exit(1);
//在此處補充填寫代碼?實現創建鍵盤監控、接收、發送三個線程,並等待線程結束 th_a, th_b, th_c;
if(pthread_create (&th_a, 0, keyboard, 0) != 0)
exit(1);
pthread_join(th_a,NULL);
if(pthread_create (&th_b, 0, receive, 0) != 0)
exit(1);
pthread_join(th_b,NULL);
if(pthread_create (&th_c, 0, send, 0) != 0)
exit(1);
pthread_join(th_c,NULL);
//在此處補充填寫代碼?實現關閉串口功能
close(fd);