英創Linux主板可以通過RS485總線掛載多個單片機組成多機系統,如圖1所示,其中Linux主機作為上位機,單片機作為從機,485總線最多能掛載256個從機。系統工作的時候,每一個從機都有自己的地址(從機號),上位機首先發送從機的地址,再發送命令/數據,其發送的命令/數據可以被每一個從機接收,從機收到命令和數據后,如果地址和自己的相符,就進行應答。
圖1 Linux主機與單片機組成的多機系統
圖2 多機通信幀格式
單片機每收到一個字節都要產生中斷,在一般情況下,當Linux主機向從機1發送數據的時候,從機2、3在每一個字節都要產生中斷,不論傳輸的是地址還是數據,也不論是不是跟自己通信。當從機設備比較多、傳輸數據比較頻繁的時候,單片機的負載將大大增加,影響正常的工作。
比較通用的解決辦法是充分利用串口固定校驗位(Parity Stick)的功能,使用Mark/Space校驗位區分地址和數據,如圖2所示的多機通信幀中,發送和接收地址字節時,可以使用Mark校驗(也可以使用Space校驗),發送和接收數據字節時,使用Space校驗(也可以使用Mark校驗)。系統初始化的時候,所有的從機都設置成Mark校驗,進入等待狀態。主機發送第一個字節(addr = 從機1)的時候使用Mark校驗。這時,所有的從機都收到了addr,并通過校驗產生中斷。在從機的中斷程序中,如果addr和自己的地址相符,就將從機設置成Space校驗(從機1),否則,繼續保持Mark校驗(從機2、3)。緊接著,主機發送data1、data2的時候使用Space校驗,這時,由于從機2、3不能通過Space校驗,將不會產生中斷,只有從機1會產生中斷,應答主機。這樣就大大降低了處于等待狀態的從機2、3的中斷負載。
對Linux目前的串口驅動程序而言,在邏輯上應用程序可以先設置一次Mark校驗位,write一個地址字節,再設置一次Space校驗,接著write多個數據字節來實現多機通信。但是,兩次調用write之間可能會有較大的時間間隙,導致單片機接收數據超時,多機通信失敗。為此,英創公司專門修改了Linux串口驅動程序,在不增加新的API調用的前提下,只需要在應用程序中連續兩次設置校驗位即可使串口驅動進入ADDR_DATA_MODE模式,支持Mark/Space多機通信,并且將同一幀數據的addr、data連續發送出去(應用程序只調用一次write函數)。應用程序具體步驟如下(為方便校驗位設置,編寫了一個校驗位設置函數):
1、校驗位設置函數
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校驗 標記數據
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; /* 轉換為偶效驗*/
}
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、主程序兩次調用校驗位設置函數,進入ADDR_DATA_MODE模式
Buf[0] = 0x39;
Buf[1] = 0xC1;
Buf[2] = 0x80;
Buf[3] = 0x1;
Buf[4] = 0x0;
//連續兩次設置校驗位,進入ADDR_DATA_MODE.
//先設置數據使用的校驗位,后設置地址使用的校驗位
m_Serial.SetParity(0); //數據使用space校驗
m_Serial.SetParity(1); //地址使用mark校驗
sleep(1);
m_Serial.WritePort( Buf, 5 );
如上程序將5個字節一起發送出去,其中Buf[0]作為地址,使用mark校驗,Buf[1-4]作為數據,使用space校驗,波形如圖3所示。所有從機收到地址后,都通過校驗位,產生中斷,但僅地址為0x39的從機會將自己的校驗位設置為0。之后Buf[1-4]僅有從機0x39能夠產生接收中斷,應答主機。
發送完這5個字節后,就退出了ADDR_DATA_MODE模式,繼續串口發送的所有字節都使用space校驗(先設置的校驗位)。如果需要其他校驗方式,可以調用SetParity()進行設置。
圖3 ADDR_DATA_MODE發送波形圖
-
Linux
+關注
關注
87文章
11345瀏覽量
210389 -
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35613
發布評論請先 登錄
相關推薦
評論