① 如何查看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*
② Linux串口相關的操作及綁定
@ toc
可在控制台輸入
也可以用stty設置串口參數
使用後相當於串口回傳,發什麼回什麼
發送數據
可以對串口發送數據比如對com1口
一般情況下串口的名稱全部在dev下面,如果你沒有外插串口卡的話默認是dev下的ttyS* ,一般ttyS0對應com1,ttyS1對應com2,當然也不一定是必然的;
如果有ttyS設備,再看/dev/有沒有ttyS*,如沒有就建立一個:
如果板子的設備中沒有標准串口設備ttyS0,也沒有ttySAC0。/dev下應該有一個USB串口:/dev/ttyUSB0.
當一個串列卡或數據卡被偵測到時,它會被指定成為第一個可用的串列設備。通常是/dev/ttyS1(cua1)或/dev/ttyS2(cua2),這完成看原已內建的串口數目。ttyS*設備會被報告在/var/run/stab內。
PC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC
可能是linux下的串口設備沒有打開,需要改變串口設備
的許可權,或者根據文章頭添加用戶到組處理
可以通過以下命令 查看 板子上的硬體埠的內核設備名
該條命令會將 ttyUSB0所對應的硬體埠的kernel設備名 顯現出來, 得到KERNEL== '1-5.5.4', 而不是之前的ttyUSB0
cmd.sh如下:
./getUSB.py 調用當前路徑下的getUSB.py這個Python語言,明確此次是哪個,ttyUSB0,或者ttyUSB1掛載在埠3-1.1上
getUSB.py:
完成之後 ,設置開機啟動cmd.sh(在/etc/rc.local中設置)則每次開機之後,會從/dev/ttydata獲取到固定埠的數據
方式一
寫入內容如下:
方式二
我的硬體序列號:ATTRS{serial}=="FTSYWCXZ"這個號是唯一的
可以通過/dev/usb_0打開串口設備
常用的匹配類型:
③ Linux下小巧的COM口連接軟體 Picocom
從上面的第一行輸出可以看出我已經鏈接了一個FT232的設備,這個就是我的連接線。
但是這還不行,還不知道他的USB會話介面號是多少,那麼在設備列表裡查一下就行了。
輸出結果顯示我有一個USB設備是可以支持tty的,這里多說一下TTY的來源(網路上找的):
大概就是如上所述的意思了,現在可以確定我們的設備名稱是 ttyUSB0 了,下面開始連接。
當最下面出現 Terminal ready 的提示就證明已經通過數據線接入到了調試設備,按下回車就可以開心的調試了。
進去後推出的方法是先按Ctrl+a,然後再按Ctrl+q就可以了。(我之前都是直接關會話,後來才知道原來是這么關)
最後說一下比他功能強大的 minicom ,之前看網路上各種的 minicom 使用方法什麼的,但是那些東西一看我就煩了,還是picocom這種軟體更適合我用,因為用起來比較簡單。
第一次寫點兒正經的東西,的Markdown看著好舒服!
④ Linux C 配置串口
配置串口需要包含頭文件
其中最核心的配置結構體為:
如何獲取該結構呢?我們操作串口跟操作文件一樣,也是調用 open() 函數來打開串口,
這樣我們就能夠得到一個文件描述符 fd ,然後就可以調用 tcgetattr() 函數來獲取上述配置結構體了。
Linux 串口默認的配置為:波特率 9600,數據位 8 位,無奇偶校驗,停止位 1 位,無 CTS/RTS 。
以下介紹一些常用的配置項:波特率、奇偶校驗、數據位、停止位、硬體控制流。
相關介面:
Linux 將串口的波特率分為了輸入波特率和輸出波特率,不過最常用的場景是將兩者設置成一樣。
cfgetispeed() 函數獲取輸入波特率, cfgetospeed() 函數獲取輸出波特率。 cfsetispeed() 函數設置輸入波特率, cfsetospeed() 函數用於設置輸出波特率,當然 cfsetspeed() 函數擴展為同時設置輸入和輸出波特率。
上述介面中的 speed_t 是一系列波特率的標志位,例如常用的 115200 波特率就為 B115200,參考下述選項:
設置奇偶校驗位可以通過修改 termios 結構體中的 c_cflag 成員來實現,若無校驗,則將 PARENB 位設為 0;若有校驗,則 PARENB 為 1。之後再根據 PARODD 來區分奇偶校驗, PARODD 為 1 表示奇校驗, PARODD 為 0 表示偶校驗。例如設置無奇偶校驗位:
設置數據位可以通過修改 termios 結構體中的 c_cflag 成員來實現,CS5、CS6、CS7 和 CS8 分別代表數據位 5、6、7 和 8。不過在設置數據位之前,需要先用 CSIZE 來做屏蔽欄位,清楚這幾個標志位,例如設置數據位為 8 位:
設置停止位可以通過修改 termios 結構體中的 c_cflag 成員來實現, CSTOPB 位為 1 表示 2 位停止位, CSTOPB 位為 0 標志 1 位停止位。例如設置停止位為 1 位:
設置硬體控制流可以通過修改 termios 結構體中的 c_cflag 成員來實現, CRTSCTS 為 1 表示使用硬體控制流,為 0 表示不使用硬體控制流。例如使能硬體控制流:
當然,最後還需要用 tcflush() 拋棄存儲在 fd 里的未接收的數據。
再利用介面 tcsetattr() 函數將配置信息寫入文件描述符 fd :
這樣整個串口最常用的用法就配置完成了。
具體的配置使用可以參考我的項目 HCI-Middleware 里的 hci_transport_uart_linux.c 文件。
參考:
⑤ linux下怎樣設置com1口,讓超級終端通過com1口進行登錄
確認有/sbin/agetty,編輯/etc/inittab,添加
7:2345:respawn:/sbin/agetty /dev/ttyS0 9600
9600bps是因為聯路由器預設一般都是這種速率,也可以設成
19200、38400、57600、115200
修改/etc/securetty,添加一行:ttyS0,確保root用戶能登錄
重啟機器,就可以拔掉滑鼠鍵盤顯示器(啟動時最好還是要看看輸出信息)了
⑥ linux下COM口設置(minicom)
波特率對不對?用戶許可權對不對?
用最新版的putty試試,感覺putty的serial比minicom好用
⑦ Ubuntu linux中怎麼查看自己的串口連接情況
我們在windows中查找自己的開發板與電腦的連接的COM口時,可以通過查找設備管理器來看,但是換到咱們的Linux系統中就不能這樣做了,下面說一下在linux中是怎麼查看COM口信息的。
首先,將我的mini2440開發板通過USB轉232串口線與PC機連接,這時候咱們的linux系統自動安轉了驅動程序,可以使用命令:dmesg 來查看安裝驅動的信息,
你也可以使用命令: ls -l /dev/ttyUSB*來查看相關的信息
至此,我們已經順利的將串口連接到Ubuntu系統上了,也查看到自己開發板連接的是USB轉串口設備/dev/ttyUSB0,如果是普通的串口設備會是/dev/ttyS*.
⑧ 如何查看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*
⑨ 在LINUX下怎樣使用COM組件
COM組件技術在Linux C++下的使用例子
COM的介面
一. 介面概念的出現
承接COM的目的,現在需要將重用的COM對象相互關聯在一起,那麼有什麼好方法呢?
(1)OO中使用public成員來讓外界和內部對象進行數據交互。COM中更進一步,只能使用public的成員函數。因為直接訪問對象內存不利於實行低耦合的模型,所以數據的交互都應該使用函數調用。
(2)一個COM對象可以提供多個函數供外部調用,這是很自然的。
(3}類似於OO中的多態,一個函數可以被多個COM對象實現,這樣調用方可以方便統一的實現所需的功能。
在C++中,我們用public成員函數來提供對外介面,用虛函數來實現多態。因此,對COM的要求,實際上就是需要一個虛基類,其定義了一組函數,然後COM類來繼承這個基類,從而也擁有了這組函數。而當COM類要有多個供外界調用的函數時,可以把這些函數分別定義在一些虛基類中,然後再用多重繼承的方法使COM類擁有這些函數。
盡管對每個函數都去定義一個虛基類也毫無不可,但很多時候這樣分散並不利於管理這些函數。因此常常把一組功能有關聯的函數合並在一個虛基類裡面。
這個只擁有一組虛函數的基類就是COM中的介面,其目的是定義COM對象被訪問的方法。每個介面都被一個GUID標識,稱為IID。
二. 介面的本質
如果把C++描述轉化成二進制代碼的話,就會發現介面本質上就是vtable,位於COM對象的開頭,指向一組函數指針。那麼為什麼是介面而不是單個函數被GUID表識,從而能夠被准確定位呢?
還是參考C++編寫的COM對象在內存中的二進製表示吧。此時其開頭是一列指針,分別對應於多重繼承而來的各個介面,然後每個指針指向一個函數指針數組,就是對應於各個介面的成員函數。因此,介面和對象在內存中是平級的!C++實現多重繼承時只不過是羅列了多個虛函數表,然後調用函數時再根據具體使用的指針類型,給指向對象的指針加上某個偏移量得到該類型對應的虛函數表,再找到具體的函數。顯然指針在介面這一層時可以很自如的通過偏移得到其它的介面指針以及對象指針——而一旦得到具體函數指針後,就很難回頭了。
COM規定了一個函數QueryInterface(),用來得到介面的指針。並把QueryInterface()放入介面類IUnknown中,而且規定所有的介面都要從IUnknown繼承,換句話說,所有的介面都要實現IUnknown類定義的那幾個函數。QueryInterface()的引入可以讓調用方在使用COM對象時,能夠在COM對象提供的介面之間自由的來回切換。當然,正如上面所述,其本質只是指向介面的指針做了偏移而已。
三. 介面的使用方法
首先,所有COM對象的介面都繼承自IUnknown,而IUnknown中是有QueryInterface()函數的。
再次,COM對象的開頭就是第一個介面的vtable,所以指向COM對象的指針同時也是指向第一個介面的指針。並且,由於介面都是繼承自IUnknown,因此這個指針也一定是指向IUnknown的指針。這樣一來的話就能夠順利調用QueryInterface(),得到某個介面的指針了。
然後,不管任何時候,只要有某介面的指針,就可以接著用QueryInterface()來得到該COM對象擁有的其它介面指針。
類廠以及COM對象的構造
二. 類廠概念的引入
類廠(ClassFactory)這個名詞其實有點迷惑性,因為這個東西實際上應該叫對象工廠。類廠也是一個普通的COM對象,它有一個特殊的介面IClassFactory,這個介面的一個函數CreateInstance()能夠生成COM對象,並返回其需要的介面。
如果把C++中的概念平移過來,就會發現類廠的作用本質上就是那個被C++編譯器隱藏了的new。在COM中沒有類定義,自然也沒有new,要想生成COM對象,只能靠COM類的規范。類廠就實現了從COM類規范到COM對象的過程。
當用C++實現COM的時候,往往在類廠也就是new出來一個對象,然後做一個QueryInterface()得到介面指針。表面上看,中間多了類廠這么一層有點多此一舉,實際上這里隱含了根據抽象的COM類在內存中生成COM對象的步驟,絕非可有可無的。
三. 類廠的返回值
在前面說過COM中以COM對象為單位實行重用,COM對象通過介面和外界交互,COM對象的介面之間可以通過偏移來實現跳轉。並且,從二進制上看,指向COM對象的指針就是指向COM對象繼承的第一個介面的指針。所以,在COM中並不需要一個指向COM對象的指針,而只需要指向該COM對象的某一個介面的指針。因此類廠最後是返回COM對象的一個介面指針來告訴用戶,這個COM對象已經生成了。當然,這個介面指針的表識(IID)需要用戶提供。
COM對象的調用
AddRef和Release
一. IUnknown介面
按照COM標准,所有的COM介面的前三個函數都必須是IUnknown介面的那三個函數:QueryInterface(),AddRef()和Release()。如果用C++表述的話,就是所有的COM介面都必須從IUnknown這個虛基類繼承而來。
QueryInterface()的作用前面已經說過了,是根據IID查詢當前COM對象是否有此介面,並返回介面指針。那麼AddRef()和Release()呢?
按照字面的意思,AddRef()的意思就是說增加當此介面被引用的次數,而Release()則是釋放。實際上也差不多就是這么回事……雖然Release()表面上看起來起一個SubRef()的名字能夠更加和AddRef()匹配一點。
二. COM對象的創建過程和引用計數的需求
如果按照一般的思想,COM對象被創建後,大家自由使用就是了,為了什麼非要引入AddRef()和Release()函數?其實這里涉及到的問題主要是COM對象的生存期問題。一個COM對象何時被誰創建?何時又被誰釋放呢?
最自然的回答肯定是需要時創建以實現應用,不需要時釋放以節約系統資源。但是這里實現就有很多問題:首先,按照前面所述,客戶並不真正的了解COM對象,它只能提供CLSID來定位COM對象,提供IID來查詢介面,然後能做的就是利用介面實現功能。在Windows的COM庫中,用CoCreateInstance()函數來封裝客戶端的調用,然後CoCreateInstance()根據CLSID在注冊表中找到實現該對象保存的文件,再根據調用方式的不同(進程內/進程外)將該文件裝載入內存,創建類廠,然後用類廠的CreateInstance()介面創建COM對象並返回IID指定的介面。這一連串的工作分的很細,主要的目的就是用中間層,比如COM庫函數和標准IClassFactory介面等隔開用戶和具體COM對象,實現更好地封裝。
既然如此,具體生成COM對象的並不是客戶端而是COM組件中和COM對象對應的類廠對象。因此,釋放或者說從內存中卸載COM對象的任務也不能是客戶端完成。而在COM組件中,類廠只管生成,那麼釋放的任務就只能交給COM對象自己完成了。
所以,最後的要求就變成了COM對象自己需要知道什麼時候能夠釋放自身,那麼就需要有一個量來表示現在到底又多少用戶在使用此COM對象,這就是引用計數了。
三. 引用計數的實現
實現引用計數的方法很簡單,用一個全局的變數來保存計數,多一個引用時加一,少一個引用時減一。COM規定當創建COM對象時先把計數從0加到1,然後加加減減,直到計數變到0,說明已經沒有用戶使用該COM對象,那麼這個就可以釋放資源了。
由於客戶端只能對介面操作,因此AddRef()和Release()需要保證能夠在任何介面下都能調用,包括IUnknown。這樣一來,這兩個函數和QueryInterface()並列成為IUnknown的三個成員也就順理成章了。
這里還有一些小問題。比如說是針對COM對象整體計數呢,還是針對各個介面計數?COM標准沒有硬性規定,但是作為COM對象的使用者,客戶端必須考慮到不同情況,所以必須是調用增加或減少引用的那個介面的AddRef()和Release()。
COM實現的技術,主要是C++的虛函數、多繼承以及動態鏈接庫(DLL)技術。
COM組件的實現:
項目代碼如下;
類廠頭文件
鏈表類廠 頭文件 ListClassFactory.h
/*************************************************************************
> File Name: ListClassFactory.h
> Created Time: 2016年09月12日 23時53分23秒 CST
************************************************************************/
#ifndef _LIST_CLASS_FACTORY_H
#define _LIST_CLASS_FACTORY_H
#include "../../ibasecom/IUnknown.h"
#include "../../ibasecom/IClassFactory.h"
class ListClassFactory : public IClassFactory
{
private:
ULONG m_cRef;
public:
ListClassFactory(){LogD("ListClassFactory: ","===ListClassFactory()===");}
~ListClassFactory(){LogD("ListClassFactory: ","====~ListClassFactory()=======");}
private:
virtual LONG QueryInterface(const IID& iid, void** ppv);
virtual ULONG AddRef();
virtual ULONG Release();
virtual IUnknown* CreateInstance(const IID& iid,void**ppv);
};
#ifdef __cplusplus
extern "C"
{
#endif
IUnknown* DllGetClassObject(const CLSID &clsid, const IID &iid, void **ppv);
IUnknown* (*g_CoCreate)(const IID& iid,void** ppv) = NULL;
#ifdef __cplusplus
}
#endif
#endif
Vector類廠 頭文件 VectorClassFactory.h
/*************************************************************************
> File Name: VectorClassFactory.h
> Created Time: 2016年08月26日 23時50分23秒 CST
************************************************************************/
#ifndef _VECTOR_CLASS_FACTORY_H
#define _VECTOR_CLASS_FACTORY_H
#include "../../ibasecom/IUnknown.h"
#include "../../ibasecom/IClassFactory.h"
class VectorClassFactory : public IClassFactory
{
private:
ULONG m_cRef;
public:
VectorClassFactory(){LogD("VectorClassFactory: ","===VectorClassFactory()===");}
~VectorClassFactory(){LogD("VectorClassFactory: ","====~VectorClassFactory()=======");}
private:
virtual LONG QueryInterface(const IID& iid, void** ppv);
virtual ULONG AddRef();
virtual ULONG Release();
virtual IUnknown* CreateInstance(const IID& iid,void**ppv);
};
#ifdef __cplusplus
extern "C"
{
#endif
IUnknown* DllGetClassObject(const CLSID &clsid, const IID &iid, void **ppv);
IUnknown* (*g_CoCreate)(const IID& iid,void** ppv) = NULL;
#ifdef __cplusplus
}
#endif
#endif
類廠實現文件 ListClassFactory.cpp
⑩ Linux串口調試工具--minicom
安裝完成後,請不要著急打開軟體。需先進行配置。具體步驟如下:
查看串口設備及文件許可權
linux下的所有操作面向用戶的都是文件操作,在對串口操作之前,我們應該先確認自己對該文件有沒有讀寫許可權。
linux下的usb串口命名為ttyUSB*,運行上面命令,可以看到有幾個設備掛載。
我們這里是:
只有ttuUSB0.再用lsusb查看:
usb 004正是我們掛上去的usb轉串口線纜,使用的晶元是PL2303。
但是正如上面顯示,ttyUSB0這個設備是root所有的,所以,我們以普通用戶身份打開minicom是沒法訪問該文件的。
運行sudo minicom -s便進入了minicom的配置界面,使用上下鍵選擇Serial port setup,回車。此時游標在「change which setting」後面停留,它的上面有如下菜單:
我們只需輸入上面對應的字母,就可以進如相應的菜單進行設置。設置完成,回車,游標會回到「change which setting」後面,如此重復。完成按回車返回主菜單即可。
返回主菜單後,選擇「Save setup as df1」,將其保存為默認設置,然後選擇 Exit退出。需退出後重新打開minicom,軟體才會使用上述參數進行初始化。
注意:如果沒有使用USB轉串口,而是直接使用串口,那麼Serial Device要配置為/dev/ttyS0。
如果上面設置順利,打開minicom
重新給設備上電後,此時,窗口裡就有信息列印出來了。
1)需使用Ctrl+a 進入設置狀態
2)按z進入設置菜單
(1)O鍵:打開配置選項;
(2)W鍵:自動卷屏。當顯示的內容超過一行之後,自動將後面的內容換行。這個功能在查看內核的啟動信息時很有用。
(3)C鍵:清除屏幕的顯示內容;
(4)B鍵:瀏覽minicom的歷史顯示;
(5)X鍵:退出minicom,會提示確認退出。
Ctrl + A --> O
選擇"Filenames and paths"
更多的參數,參見"man minicom"的輸出。
如果不加這個項,那麼在minicom和pc交互的時候中鍵入命令超過一行時候會被截斷,(這時候可以通過 <C-a> w 來開和關切換截斷行功能).
這樣,啟動之後我們會發現顯示的內容不是黑白的了。
這樣,啟動之後,所在minicom的輸出都會在<filename>中保留一份,如果原來文件存在,則追加,不存在則創建一個。
這樣,我們可以取代用 <C-a> * 發送命令的方式,將 <C-a> 替換成 [Alt] 或者 [ESC] .
這里,<filename>是你的腳本文件的名字,應該指定絕對路徑,否則就會在你啟動minicom的路徑下尋找。
Minicom是基於窗口的。要彈出所需功能的窗口,可按下 Ctrl-A (以下使用C-A來表示Ctrl-A),然後再按各功能鍵(a-z或A-Z)。先按C-A,再按'z',將出現一個幫助窗口,提供了所有命令的簡述。配置 minicom(-s 選項,或者C-A、O)時,可以改變這個轉義鍵,不過現在我們還是用Ctrl-A吧。
這里,只給出很少的命令,更多的交互命令參見"<C-a> z"的幫助輸出。
minicom -s 或啟動minicom之後運行 <C-a> o 來進行配置。
C:腳本文件的存放位置: <C-a> g 運行腳本時的路徑 。
D:選擇腳本程序: 默認 runscript ,也可以選擇 bash 腳本格式。
可以參考man手冊 man runscript .交互命令中可以運行" <C-a> G "來運行腳本。
參考資料 :