英創(chuàng)Linux主板可以通過RS485總線掛載多個單片機組成多機系統(tǒng),如圖1所示,其中Linux主機作為上位機,單片機作為從機,485總線最多能掛載256個從機。系統(tǒng)工作的時候,每一個從機都有自己的地址(從機號),上位機首先發(fā)送從機的地址,再發(fā)送命令/數(shù)據(jù),其發(fā)送的命令/數(shù)據(jù)可以被每一個從機接收,從機收到命令和數(shù)據(jù)后,如果地址和自己的相符,就進行應答。
圖1 Linux主機與單片機組成的多機系統(tǒng)
圖2 多機通信幀格式
單片機每收到一個字節(jié)都要產(chǎn)生中斷,在一般情況下,當Linux主機向從機1發(fā)送數(shù)據(jù)的時候,從機2、3在每一個字節(jié)都要產(chǎn)生中斷,不論傳輸?shù)氖堑刂愤€是數(shù)據(jù),也不論是不是跟自己通信。當從機設備比較多、傳輸數(shù)據(jù)比較頻繁的時候,單片機的負載將大大增加,影響正常的工作。
比較通用的解決辦法是充分利用串口固定校驗位(Parity Stick)的功能,使用Mark/Space校驗位區(qū)分地址和數(shù)據(jù),如圖2所示的多機通信幀中,發(fā)送和接收地址字節(jié)時,可以使用Mark校驗(也可以使用Space校驗),發(fā)送和接收數(shù)據(jù)字節(jié)時,使用Space校驗(也可以使用Mark校驗)。系統(tǒng)初始化的時候,所有的從機都設置成Mark校驗,進入等待狀態(tài)。主機發(fā)送第一個字節(jié)(addr = 從機1)的時候使用Mark校驗。這時,所有的從機都收到了addr,并通過校驗產(chǎn)生中斷。在從機的中斷程序中,如果addr和自己的地址相符,就將從機設置成Space校驗(從機1),否則,繼續(xù)保持Mark校驗(從機2、3)。緊接著,主機發(fā)送data1、data2的時候使用Space校驗,這時,由于從機2、3不能通過Space校驗,將不會產(chǎn)生中斷,只有從機1會產(chǎn)生中斷,應答主機。這樣就大大降低了處于等待狀態(tài)的從機2、3的中斷負載。
對Linux目前的串口驅(qū)動程序而言,在邏輯上應用程序可以先設置一次Mark校驗位,write一個地址字節(jié),再設置一次Space校驗,接著write多個數(shù)據(jù)字節(jié)來實現(xiàn)多機通信。但是,兩次調(diào)用write之間可能會有較大的時間間隙,導致單片機接收數(shù)據(jù)超時,多機通信失敗。為此,英創(chuàng)公司專門修改了Linux串口驅(qū)動程序,在不增加新的API調(diào)用的前提下,只需要在應用程序中連續(xù)兩次設置校驗位即可使串口驅(qū)動進入ADDR_DATA_MODE模式,支持Mark/Space多機通信,并且將同一幀數(shù)據(jù)的addr、data連續(xù)發(fā)送出去(應用程序只調(diào)用一次write函數(shù))。應用程序具體步驟如下(為方便校驗位設置,編寫了一個校驗位設置函數(shù)):
1、校驗位設置函數(shù)
intCSerial::SetParity(intparity)
{
structtermios new_opt;
intstatus;
unsignedintold_ccflag;
tcgetattr(m_fd,&new_opt);
old_ccflag = new_opt.c_cflag;
new_opt.c_cflag &= ~PARODD ;
new_opt.c_cflag &= ~CMSPAR ;
if(parity == 0)
{
//使用Space校驗 標記數(shù)據(jù)
new_opt.c_cflag |= PARENB | CS8 | CMSPAR;
}
elseif(parity == 1)
{
//使用Mark校驗 標記地址
new_opt.c_cflag |= PARENB | CS8 | CMSPAR | PARODD;
}
elseif(parity == 2)
{ //使用偶校驗
new_opt.c_cflag |= PARENB; /* Enable parity */
new_opt.c_cflag &= ~PARODD; /* 轉(zhuǎn)換為偶效驗*/
}
elseif(parity == 3)
{
//使用奇校驗
new_opt.c_cflag |= (PARODD | PARENB); /* 設置為奇效驗*/
}
else
{
new_opt.c_cflag = old_ccflag;
}
status = tcsetattr(m_fd,TCSANOW,&new_opt);
returnstatus;
}
2、主程序兩次調(diào)用校驗位設置函數(shù),進入ADDR_DATA_MODE模式
Buf[0] = 0x39;
Buf[1] = 0xC1;
Buf[2] = 0x80;
Buf[3] = 0x1;
Buf[4] = 0x0;
//連續(xù)兩次設置校驗位,進入ADDR_DATA_MODE.
//先設置數(shù)據(jù)使用的校驗位,后設置地址使用的校驗位
m_Serial.SetParity(0); //數(shù)據(jù)使用space校驗
m_Serial.SetParity(1); //地址使用mark校驗
sleep(1);
m_Serial.WritePort( Buf, 5 );
如上程序?qū)?個字節(jié)一起發(fā)送出去,其中Buf[0]作為地址,使用mark校驗,Buf[1-4]作為數(shù)據(jù),使用space校驗,波形如圖3所示。所有從機收到地址后,都通過校驗位,產(chǎn)生中斷,但僅地址為0x39的從機會將自己的校驗位設置為0。之后Buf[1-4]僅有從機0x39能夠產(chǎn)生接收中斷,應答主機。
發(fā)送完這5個字節(jié)后,就退出了ADDR_DATA_MODE模式,繼續(xù)串口發(fā)送的所有字節(jié)都使用space校驗(先設置的校驗位)。如果需要其他校驗方式,可以調(diào)用SetParity()進行設置。
圖3 ADDR_DATA_MODE發(fā)送波形圖
-
Linux
+關(guān)注
關(guān)注
87文章
11350瀏覽量
210477 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6086瀏覽量
35638
發(fā)布評論請先 登錄
相關(guān)推薦
芯盛智能榮獲2024年信息技術(shù)應用創(chuàng)新工作委員會卓越貢獻成員單位
國產(chǎn)工控主板,信創(chuàng)產(chǎn)業(yè)發(fā)展新引擎
中科創(chuàng)達榮獲2024年軟件和信息技術(shù)服務優(yōu)秀企業(yè)
英銳恩科技引領(lǐng)微控制器MCU技術(shù)創(chuàng)新,賦能多元化應用!
英銳恩科技,以實力打造國產(chǎn)單片機替代品牌!
用8位單片機,32位單片機就找英銳恩!
信創(chuàng)國產(chǎn)化背景下的工控主板發(fā)展現(xiàn)狀
UART串口通訊協(xié)議解析
中軟國際信創(chuàng)服務助力大連信創(chuàng)產(chǎn)業(yè)發(fā)展
IPv6 在信創(chuàng)產(chǎn)業(yè)中的發(fā)展歷程
![IPv6 <b class='flag-5'>在</b>信<b class='flag-5'>創(chuàng)</b>產(chǎn)業(yè)<b class='flag-5'>中</b>的發(fā)展歷程](https://file1.elecfans.com/web2/M00/C5/C0/wKgZomYCLwmAfli7AABIy8BbLIQ973.png)
評論