當前位置:首頁 » 操作系統 » linux串口驅動

linux串口驅動

發布時間: 2022-01-10 21:33:04

linux 怎麼 在 驅動中 使用串口

Linux發行版自帶usb to serial驅動,以模塊方式編譯驅動,在內核源代碼目錄下運行Make MenuConfig選擇Devces
drivers-->USB seupport--> <M>USB Serial Converter support
--> <M> USB driver for GSM and CDMA modems & [*]USB Generic
Serial Driver,保存退出。運行make
moles,編譯成功後可找到usbtoserial.ko及option.ko兩個驅動(2.6以上內核版本模塊驅動用.ko表示)。

⑵ linux 串口驅動程序術語介紹

在Linux中經常碰到「控制台」、「終端」、「console」、「tty」、「terminal」等術語,也經常使用到這些設備文件:ldevconsole、/dev/ttySACO、/dev/tty0等。要理解這些術語,需要從以前的計算機說起。
最初的計算機價格昂貴,一台計算機通常連接上多套鍵盤和顯示器供多人使用。在以前專門有這種可以連上一台電腦的設備,它只有顯示器和鍵盤,外加簡單的處理電路,本身不具有處理計算機信息的能力。用戶通過它連接到計算機上(通常是通過串口),然後登錄系統,並對計算機進行操作。這樣一台只有輸入、顯示部件(比如鍵盤和顯示器)並能夠連接到計算機的設備就叫做終端。tty 是Teletype 的縮寫,Teletype是最早出現的一種終端設備,很像電傳打字機。在Linux中,就用tty來表示「終端」,比如內核文件tty_io.c、tty _ioctl.c等都是與「終端」相關的驅動程序;設備文件/dev/ttySACO、/dev/tty0等也表示某類終端設備。「console」的意思即為「控制台」,顧名思義,控制台就是用戶與系統進行交互的設備,這和終端的作用相似。實際上,控制台與終端相比,也只是多了一項功能:它可以顯示系統信息,比如內核消息、後台服務消息。從硬體上看,控制台與終端都是具備輸入、顯示功能的設備,沒有區別。「控制台」、「終端」、「控制終端」這些名詞經常混著用,表示的是同一個意思。
控制台與終端的區別體現在軟體.上,Linux內核從很早以前發展而來,代碼中仍保留了「控制台」、「終端」的概念。啟動Linux內核前傳入的命令行參數「console=…」就是用來指定「控制台」的。控制台在tty 驅動初始化之前就可以使用了,它最開始的時候被用來顯示內核消息(比如 printk 函數輸出的消息)。

⑶ linux下usb轉串口的驅動怎麼裝啊

Linux發行版自帶usb to serial驅動,以模塊方式編譯驅動,在內核源代碼目錄下運行Make MenuConfig選擇Devces
drivers-->USB seupport--> <M>USB Serial Converter support
--> <M> USB driver for GSM and CDMA modems & [*]USB Generic
Serial Driver,保存退出。運行make
moles,編譯成功後可找到usbtoserial.ko及option.ko兩個驅動(2.6以上內核版本模塊驅動用.ko表示)。

⑷ 如何查看linux下串口是否可用串口名稱等

1、查看串口是否可用,可以對串口發送數據比如對com1口,echo lyjie126 > /dev/ttyS0

2、查看串口名稱使用 ls -l /dev/ttyS* 一般情況下串口的名稱全部在dev下面,如果你沒有外插串口卡的話默認是dev下的ttyS* ,一般ttyS0對應com1,ttyS1對應com2,當然也不一定是必然的;

3、查看串口驅動:cat /proc/tty/drivers/serial

4、查看串口設備:dmesg | grep ttyS*

(4)linux串口驅動擴展閱讀

介面劃分標准

同步串列介面(英文:SynchronousSerialInterface,SSI)是一種常用的工業用通信介面。。

非同步串列是指UART(Universal Asynchronous Receiver/Transmitter),通用非同步接收/發送。UART是一個並行輸入成為串列輸出的晶元,通常集成在主板上。UART包含TTL電平的串口和RS232電平的串口。 TTL電平是3.3V的,而RS232是負邏輯電平,它定義+5~+12V為低電平,而-12~-5V為高電平,MDS2710、MDS SD4、EL805等是RS232介面,EL806有TTL介面。

串列介面按電氣標准及協議來分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422與RS-485標准只對介面的電氣特性做出規定,不涉及接插件、電纜或協議。

⑸ LINUX怎麼添加USB串口驅動

Linux發行版自帶usb
to
serial驅動,以模塊方式編譯驅動,在內核源代碼目錄下運行Make
MenuConfig選擇Devces
drivers-->USB
seupport-->
USB
Serial
Converter
support
--

⑹ 求教,linux下網口虛擬串口驅動程序

開發虛擬串口驅動程序

虛擬串口就是當本地並沒有對應的串口硬體設備,而為應用層提供串口設備一樣的系統調用介面,以兼容原本使用本地串口的應用軟體的「虛」設備。本文作者給出了一種在Windows平台上實現虛擬串口的方法,由此實現的「串口」具有真實串口完全相同的系統調用介面。
在很多應用中需要用到虛擬串口,如在Modem卡出現之前,已經有了接在計算機串口上的外部Modem,而且各種拔號程序也是通過串口與外部Modem通信的。為了讓已有的拔號程序不做修改,像使用外部Modem一樣使用內置卡,就需要內置卡的驅動程序虛擬一個串口設備。又如當前工業界使用的一些串口伺服器,往往有8個或16個甚至更多的串口,以連接多個串口設備,再通過一個網卡直接連入乙太網。與它在同一網路上的計算機就通過乙太網與串口伺服器上掛接的串口設備通信。為了讓計算機中原來使用本地串口的軟體兼容,就需要在計算機上提供虛擬串口驅動。
虛擬串口的設計關鍵在於,該「串口」實現後必須具有與真實串口完全相同的系統調用介面。要做到這點,從已有的串口設備驅動程序上做修改是最佳捷徑。下文就介紹以Windows NT上的串口驅動程序為基礎,開發可運行於Windows NT、Windows 2000、Windows XP的各個版本虛擬串口驅動程序。
串口驅動中使用的幾個鏈表
由於串口是雙工設備,在一個讀請求發出來還沒有完成之前,同時可以發出寫請求,加上在驅動程序層所有I/O請求都要求非同步完成,即前一個請求尚沒有完成,下一個相同的請求可能又來了。為此,串口驅動程序需要使用多個雙向鏈表數據結構來處理各種IRP(I/O Request Packet,I/O請求包)。當收到一個IRP,先判斷是否可立即完成,可以馬上處理並返回,如果不允許則將IRP插在相應鏈表尾,在適當的時候如設備有空閑時處理,這時往往會產生一個硬體中斷,激發DPC(Deferred Procere Call,暫緩過程調用)過程,由DPC處理函數逐個從鏈表頭取出IRP並試著完成它。串口驅動中有以下幾個鏈表和DPC(在serial.h中有定義):
ReadQueue 和 CompleteReadDpc
用於保存Read IRP的鏈表和用於調度的DPC,與DPC對應的處理函數是SerialCompleteRead,它在read.c文件中,該函數的主要任務就是從ReadQueue中提取下一個IRP,並試著完成它。
WriteQueue 和 CompleteWriteDpc
用於保存Write IRP的鏈表和對應的DPC,與DPC對應的函數是SeriaCompleteWrite,它的實現在write.c中,該函數負責從WriteQueue中提取IRP,並試著完成它。
MaskQueue 和 CommWaitDpc
這一對鏈表用於處理Windows串口驅動的一個特性:事件驅動機制。它允許應用程序預設一個事件標志,而後等待與標志對應事件發生。DPC所調用的函數是SerialCompleteWait,它實現在Waitmask.c文件中,該函數也是試著從MaskQueue中提取IRP並完成它。
PurgeQueue
該鏈表與前面幾個稍有不同,它沒有與之相對應的DPC機制,而是在每次收到Purge請求時從PurgeQueue中逐個提取IRP並試著完成,因某種原因不能完成時則插入鏈表。相應的函數是purge.c文件中的SerialStartPurge。
以上機制是串口驅動程序的重要實現方法,在虛擬串口驅動中需要保留,但不同的是,硬體串口驅動中是ISR(中斷服務程序)根據收、發或MODEM中斷來激發相應的DPC,而在虛擬串口驅動中將因實際情況不同會有不同的激發機制。
DriverEntry的實現
DriverEntry是驅動程序的入口函數,相當於應用程序C語言中的main函數,開發一個虛擬串口驅動首先要修改的就是它。它的函數實體在initunlo.c文件中。只是在虛擬串口驅動中由於不與具體的硬體打交道,就不存在硬體資源分析、硬體初始化、判斷其工作狀態等處理,只需要為虛擬串建立設備對象、符號鏈接和初始化數據結構。一個典型函數實現大體如下:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
/*填寫DriverObject->MajorFunction[]數組*/
/*建立設備對象*/
/*初始化SERIAL_DEVCIE_EXETENSION數據結構*/
Status = IoCreateDevice(DriverObject, sizeof(SERIAL_DEVICE_EXTENSION), &uniNameString, FILE_DEVICE_SERIAL_PORT, 0,TRUE,&deviceObject);
//初始化所有鏈表
InitializeListHead(&extension->ReadQueue);
InitializeListHead(…);
…;
//初始化所有DPC
KeInitializeDpc(&extension->CompleteReadDpc,SerailCompleteRead,extension);
KeInitializeDpc(…);
/*建立符號鏈接*/
SerialSetupExternalNaming(extension);
return Status;
}
SerialRead和SerialCompleteRead的實現
函數SerailRead和SerialCompleteRead決定了對Read IRP的響應策略,它們都存於read.c中。以串口伺服器要用的虛擬串口為例,當串口伺服器收到來自外部數據時將通過網路發至計算機,計算機則產生相應的網路中斷並進行協議數據處理。網路接收線程緩存新收到的數據並激活CompleteReadDpc,從而SerialCompleteReadIrp得到調用,它再調用CompleteReadIrp對每個IRP進行處理。它們的實現大體如下:
NTSTATUS SerialRead(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
/*此處略去變數聲明和初始化*/
/*提取IRP中相關的數據*/
stack = IoGetCurrentIrpStackLocation(Irp);
ReadLen = stack->Parameters.Read.Length;
/*先看本地緩沖有數據否?有的話先讀取*/
if(Extension->InCounter > 0 )
{ //注意這里要加鎖,以防數據訪問沖突
KeAcquireSpinLock(&Extension->
ReadBufferLock,&lIrql);
FirstRead = (ReadLen>Extension->
InCounter)? Extension->InCounter: ReadLen;
RtlCopyMemory(Irp->AssociatedIrp.
SystemBuffer,Extension->pInBuffer,FirstRead);
Extension->InCounter -= FirstRead;
ReadLen -= FirstRead;
KeReleaseSpinLock(&Extension->
ReadBufferLock,lIrql);//釋放鎖
}
/*是否已讀到足夠數據?是的話則完成該IRP*/
if( 0 == ReadLen)
{
status=STATUS_SUCCESS;
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = FirstRead;
IoCompleteRequest(Irp,0);
return status;
}
/*沒有則將IRP插入隊列中,通過網路向串口伺服器發出讀數據請求*/
IoMarkIrpPending(Irp);
InsertWaitList(Extension->ReadQueue,Irp);
status = TdiSendAsync(Extension->ComChannel,pAckPacket,PacketLen(pAckPacket),(PVOID)ReadAckComplete,Irp);
/*返回PENDING,表示該IRP尚沒有完成*/
return STATUS_PENDING;
}
Void CompleteReadIrp(IN PSERIAL_DEVICE_EXTENSION extension,IN PIRP Irp,IN PUCHAR pInData,IN ULONG Length )
{
/*此處略去變數聲明和初始化*/
/*讀取新數據*/
ReadLen = (ReadLen > Length)? Length : ReadLen;
if(ReadLen != 0)
{
RtlCopyMemory(pReadAsync->
pReadBuffer,pInData,ReadLen);
pReadAsync->pReadBuffer += ReadLen;
pReadAsync->ReadAlready += ReadLen;
extension->PerfStats.ReceivedCount +=
ReadLen;
}
else
{
/*因為串口伺服器端只有在已經有了相應的數據或超過時間(此時,Length=0)才會發來應答並激活本DPC過程,所以此時已經超時,為了便於結束本IRP,這里有意改變TotalNeedRead,造成接收完畢的假象*/
pReadAsync->TotalNeedRead =
pReadAsync->ReadAlready;
}
if(pReadAsync->TotalNeedRead == pReadAsync->ReadAlready)
{
/*該IRP是否已經接收完畢,是的話則結束該
IRP*/
EndReadIrp(Irp);
/*從ReadQueue中取下一個IRP*/
}
/*本IRP沒有完成也沒有超時,則繼續等待本DPC下次被激活,注意此時要判斷IRP是否被要求取消*/
}
SerialWrite和SerailCompleteWrite的實現
SerialWrite和SerailCompleteWrite決定了Write IRP的實現。在SerialWrite中調用了網路發送函數TdiSendAsync,當該發送完成後將激活CompleteWriteDpc,調度SerialCompleteWrite函數,而它主要就是取出當前的WriteIRP,設置已經發送的數據數量,調用CompleteWriteIrp做該IRP的進一步處理。它們大體如下:
NTSTATUS SerialWrite(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
/*此處略去變數聲明和初始化*/
/*從IRP中提取有關數據*/
stack=IoGetCurrentIrpStackLocation(Irp);
SendLen = stack->Parameters.Write.Length;
/*為網路發送和非同步操作分配緩沖,在CompleteWrite中全部數據發送完後釋放*/
pWriteAsync = ExAllocatePool(NonPagedPool,
SendLen+PACKET_HEADER_LEN+sizeof(WRITE_ASYNC));
if(pWriteAsync == NULL)
{
//錯誤處理
}
//保存非同步數據

//設置網路發送數據包
BuildDataPacket(pPacket,WRITE,(USHORT)SendLen,pWriteAsync->pWriteBuffer);
/*先將IRP暫時阻塞並插入隊列,在CompleteWrite中完成*/
IoMarkIrpPending(Irp);
InsertWaitList(extension->WriteQueue, Irp);
/*將寫請求和相關數據通過網路發向串口伺服器,由它負責將數據傳到具體串口設備*/
status = TdiSendAsync(Extension->ComChannel,pPacket,PacketLen(pPacket),(PVOID)CompleteWriteIrp,Irp);
//統計數據累加
Extension->PerfStats.TransmittedCount += SendLen;
return STATUS_PENDING;
}

NTSTATUS CompleteWriteIrp(IN PDEVICE_OBJECT deviceobject,IN PIRP pIrp,IN PVOID context)
{
/*此處略去變數聲明和初始化*/
SendLen=pWriteAsync->TotalNeedWrite - pWriteAsync->WroteAlready;
if(SendLen == 0)//全部數據發送完畢
{
EndWaitWriteIrp(pWriteIrp,STATUS_SUCCESS,
pWriteAsync->WroteAlready,pWriteAsync);
//從WriteQueue中取下一個IRP;
}
else //發送剩餘數據
{
if(pWriteIrp->Cancel)
{
//IRP被要求取消,完成WriteIrp
EndWaitWriteIrp(pWriteIrp,STATUS_CANCELLED,
pWriteAsync->WroteAlready,pWriteAsync);
return STATUS_CANCELED;
}
else
{
//再次設置網路數據包並發送
BuildDataPacket(…);
status = TdiSendAsync(…);
//統計數據累加
Extension->PerfStats.TransmittedCount +=
SendLen;
return STATUS_MORE_PROCESSING_REQUIRED;
}
}
}
其他幾個介面函數的實現
除Read/Write外,SerialUnload、SerialCreateOpen、 SerialClose、SerialCleanup、SerailFlush等調用介面是硬體相關性比較弱的介面函數,基本不要修改,直接刪除原來操作硬體的部分即可。復雜一點就是SerialIoControl,該介面函數包含有大量設置、讀取串口硬體狀態的處理,可建立一個本地數據結構隨時保存虛擬串口的當前硬體狀態。同時為了保證串口伺服器端的真實串口狀態和上層軟體要求的一致,需要將所有設置請求通過網路發送到伺服器端,由它負責改變真實硬體的狀態。

⑺ 請教LINUX 下RS485串口驅動的問題

RS-232:用於與數據機、列印機及其它PC外設之間的通信。最大電纜長度為100英尺(典型值)。
RS-422:適用於單主機(驅動器)工業環境。典型應用包括:過程自動化(化工、釀造、造紙)、工廠自動化(汽車製造、金屬加工)、HVAC、安防、電機控制、運動控制等。
RS-485:適用於多主機/驅動器工業環境。其典型應用與RS-422相似,包括:過程自動化(化工、釀造、造紙)、工廠自動化(汽車製造、金屬加工)、HVAC、安防、電機控制、運動控制。
我們知道串口RS232有效傳輸距離為15米。我們播控中使用的錄像機如DVCPRO、IMX控制介面有RS232、RS422多個介面供選擇,如果使用pin9則為RS422介面,視頻伺服器編解碼口控制都是RS422介面,只是插口為RJ45不是DB9的,需要轉換線纜進行轉換。因此我們在控制中根據以上特性可以靈活使用,我們由於主備控制切換的需要,以及距離的考慮統一選用RS422倒換開關進行倒換,控制RS422倒換開關的為RS232控制介面,這個直接由播控機本身的COM口來控制倒換開關進行倒換,其他控制錄像機、切換台、視頻伺服器編解碼卡使用MOXA卡擴展的RS422介面進入RS422倒換開關進行倒換。

⑻ linux下安裝串口卡驅動(高手請進)

一般的 安裝 驅動:

找到 src 包,都是 源程序

make install

就可以了

good luck

⑼ linux系統驅動不起來串口3到6

兩者的串口都是不一樣的,所以的話它的系統驅動也是不一樣,這就是它們之間的區別。

⑽ Linux系統下PCI轉串口卡驅動安裝方法

以下答案是我從我愛買電腦配件批發網上摘過來的,。
由於公司產品要做行業市場,而產品與行業用戶間PC的通訊為RS232串口方式。而行業用戶那裡的PC都沒有串列口,而且行業用戶PC操作系統為Turbo Linux。怎麼辦?
辦公室內有台機器是RedHat Linux 9.0 一個是 Fedora Core 5 。就先在這兩個系統上試驗吧。這兩台電腦上各自本身就有2個RS232串口。
一、PCI轉串口卡安裝 型號NetMos Nm9835CV
1、插入PCI卡到主機
2、啟動 Linux,打開終端
3、輸入命令:#setserial /dev/ttyS0 -a (COM-1)
顯示內容:/dev/ttyS0, Line 0, UART: 16550A, Port: 0x3f8, irq: 4
Baud_base: 115200, clos_delay: 50, divisor: 0
closing_wait: 3000, closing_wait2: infinite
Flags: spd_normal skip_test
4、輸入命令:#setserial /dev/ttyS2 -a (COM-3)
顯示內容:/dev/ttyS2, Line 2, UART: unknown, Port: 0x3e8, irq: 4
Baud_base: 115200, clos_delay: 50, divisor: 0
closing_wait: 3000, closing_wait2: infinite
Flags: spd_normal skip_test
第3、4步操作的目的主要是對主機自帶串口及PCI擴展串口的區別。區別在於4顯示的內容中UART:未unknow。不過若您檢測這一步的時候 UART為16550A而不是unknow,證明你的系統已經認識了擴展的串口,不需要進一步設置,直接跳入第8步測試就可以了。
5、需要輸入命令查看一下您當前PCI檢測的狀態,以便對擴展串口進行設置
#more /proc/pci
會顯示出一堆的信息,不要因為看不懂而嚇壞了。只要看到類似於這個PCI的信息,比如:PCI communication。。。或者Board with Nm9835CV part。。。 可能就是這個卡了,主要看看它的終端是多少,即irq多少及分配的地址是多少。例如:(不一定完全一樣)
Board with Nm9835CV part irq:11
I/O at 0xc000 [0xc001] serial port 1
I/O at 0xc400 [0xc401] serial port 2
I/O at 0xc800 [0xc801] not used
I/O at 0xd000 [0xd001] not used
I/O at 0xd400 [0xd401] not used
I/O at 0xd800 [0xd801] not used
6、知道PCI擴展卡的終端為11 串口1地址為0xc000 串口2地址為0xc400..
就可以設置擴展的串口了。輸入命令:
setserial /dev/ttyS2 port 0xc000 UART 16550A
irq 11 Baud_base 115200
另一個串口也類似的這么操作

7、設置完畢後,就可以看看設置的情況了,輸入第2步的命令看看,UART是否就是16500A 而不是 unknow了,如果是16500A恭喜,可能設置好咯,如果不是那就再檢查一下吧。
8、設置好了後是不是需要測試一下是否能夠通訊呢?最好的辦法是兩台pc相連。如果pc為windows操作系統就用超級終端,是linux呢就用minicom吧
9、裝有linux的機器,首先需要設置一下監聽的串口參數,輸入命令
#minicom -s
進入界面後有個框彈出來,如果你還認識點英文單詞的話,就回知道選擇哪個的。應該是第三個吧,串口設置。
將第一行更改為 /dev/ttyS2
波特率也更改您所需要的。
更改完後保存,保存的那個菜單應該是 save ... df1
最後 exit
10、在另外一台機器發送數據,這台機器minicom界面就能夠收到信息了,成功後覺得挺有意思。另外不要把兩個COM順序弄翻了,如果弄錯了哪個是COM3 COM4測試可就不靈便咯。

熱點內容
安卓上哪裡下大型游戲 發布:2024-12-23 15:10:58 瀏覽:189
明日之後目前適用於什麼配置 發布:2024-12-23 14:56:09 瀏覽:55
php全形半形 發布:2024-12-23 14:55:17 瀏覽:828
手機上傳助手 發布:2024-12-23 14:55:14 瀏覽:732
什麼樣的主機配置吃雞開全效 發布:2024-12-23 14:55:13 瀏覽:830
安卓我的世界114版本有什麼 發布:2024-12-23 14:42:17 瀏覽:710
vbox源碼 發布:2024-12-23 14:41:32 瀏覽:278
詩經是怎麼存儲 發布:2024-12-23 14:41:29 瀏覽:660
屏蔽視頻廣告腳本 發布:2024-12-23 14:41:24 瀏覽:419
php解析pdf 發布:2024-12-23 14:40:01 瀏覽:818