Linux 上串列埠PRC 協議的實現

2021-09-23 18:15:08 字數 3643 閱讀 4820

最近一直在研究如何實高效能cortex-a 處理器在工業控制,物聯網領域的應用。cortex-a 核心的soc 晶元通常執行linux os ,直接支援的硬體介面不多,而且不夠靈活。我們傾向採用cortex-m 微控制器作為cortex-a的擴充套件io來使用。為了提高軟體研發的效率cortex-m 執行arm 公司的mbed os。

那麼問題來了,cortex-m 和cortex-a 之間如何通訊和控制呢?硬體方面我們嘗試果ethernet,spi 和uart。軟體方面採用各種自定義的交換協議。本文介紹如何在usb 串列埠上實現rpc 協議。

rpc 的全稱是遠端過程呼叫(remote procedure call),它是乙個比較古老的協議。伴隨著tcp/ip 協議的出現就出現了。 rpc 是request/response的架構。

現在rpc 協議可以在許多協議上實現,例如http。當然也可以在串列埠上實現。

資訊格式更加傾向於xml和json格式。例如在json rpc 協議中:

-->

我在另一篇博文《關於jsonrpc》一文中有關於jsonrpc比較詳細的介紹。

在cortex-m 的串列埠上實現json 格式的prc 開銷比較大,需要進行json 的解析。涉及資料格式轉換,傳輸的時間也占有比較大,所以我們並不傾向使用jsonrpc 來實現cotex-m上的rpc協議,而是採納了類似modbus rtu幀結構的形式來實現

請求(request)

address(1 byte)

method(1 byte)

length(2 byte)

parameters(n byte)

lrc(2 byte)

響應(response)

address(1 byte)

method(1 byte)

length(2 byte)

results(n byte)

lrc(2 byte)

address,method 是1 個位元組,length 為兩個位元組,高位在前,低位在後。

results和parameters 是長度為length 的位元組。而lrc是2個位元組。

下面是serial prc類的實現。

linux 端(serialrpc.hpp)

#include "serialport.hpp"

#include class serialrpc

;

serialrpc.cpp

#include "serialrpc.hpp"

#include #define default_baud_rate 9600

serialport serial;

const uint8_t auchcrchi[256]=;

const uint8_t auchcrclo[256]=;

serialrpc::serialrpc()

bool serialrpc::init(const char * dev)

bool serialrpc::callmethod(uint8_t address,uint8_t method,uint8_t *data,int length )

bool serialrpc::waitresult(uint8_t * data)

break;

}case 1:

else if(ch==(_method+0x80))

state=10;

else

return 0;

break;

}case 2:

case 3:

case 4:

break;

}case 5:

case 6:;

serialrpc.cpp(mbed os)

#include "serialrpc.h"

#define default_baud_rate 115200

const char auchcrchi[256]=;

const char auchcrclo[256]=;

serialrpc::serialrpc()

:serial(false,0x1f00,0x2012,0x0001)

bool serialrpc::connect()

uint8_t serialrpc::waitcall(uint8_t *data)

; ch=serial.getc();

printf("0x%2.2x ",ch);

switch(state)

break;

}case 1:

case 2:

case 3: else state=5;

break;

}

case 4:

break;

}case 5:

case 6:

void serialrpc::readbuffer(uint8_t * buf,int length)

case 2:

}buf[0]=ok;

rpc.sendresult(buf,1);

break;

}case degitalout_read:

case 2:

}buf[0]=val;

rpc.sendresult(buf,1);

break;

} case degitalout_filpflop:

case 2:

}buf[0]=ok;

rpc.sendresult(buf,1);

break;

} }

}

}

linux 端(serialrpctest)

#include "serialrpc.hpp"

#include #include #define digitalout_write 0

#define digitalout_read 1

#define digitalout_filpflop 2

serialrpc inte***ce;

class digitalout

void write(bool value)

bool read ()

char flipflops()

{ cout<

buf[0]=_gpio;

inte***ce.callmethod(0,digitalout_filpflop,buf,1);

inte***ce.waitresult(buf);

cout <

cout實現 led 閃爍,也可以寫成:

bool val;

val=!led.read();

led.write(val);

但是互動的資料多了一點。所以我設計了乙個flipflop。

Linux上的串列埠程式設計

linux下的傳統硬體串列埠命名為ttys 其中可以是1,2,3 等,例如ttys1,ttys2,ttys23 等等。它們類似於windows下的com1,com2等。在linux中,串列埠等硬體元件被視為檔案,並在檔案系統的 dev資料夾中組合在一起。如果導航到 dev資料夾並使用ls命令列出檔案...

Android TCP協議與UDP協議的實現

tcp協議 安卓真機與pc之間可以通過serversocket 與 socket進行通訊,使用的是tcp ip協議。tcp對網路要求很高,具有可靠的安全性 伺服器 public class server public void server int port catch exception e 客戶...

串列埠下的MODBUS協議

modbus協議是modicon公司於1978年發明的一種用於電子控制器進行控制和通訊的通訊協議。是工業控制器的網路協議中的一種,屬於應用層的協議 通過此協議,控制器相互之間 控制器經由網路 例如乙太網 和其它裝置之間可以進行通訊 modbus的兩種常用傳輸方式 ascii模式和rtu模式 查詢 查...