生活随笔
收集整理的這篇文章主要介紹了
.Net Micro Framework研究—TCP/IP通信
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
試驗平臺:Digi MF開發板
關于網絡通信方面,Digi提供了兩個程序,一個是TCP Server運行在Digi的開發板上,一個是TCP Client程序,運行在PC上,通過網絡,上位機很容易控制Digi開發的IO信號。客戶端程序運行后的界面如下:
?
(圖MF071029004.jpg)
如果僅僅運行一下示例程序,那顯然不過癮!既然串口實現了Modbus Rtu協議,那么網口就實現Modbus Tcp協議吧,實現的Modbus Tcp協議比我們用串口實現Modbus Rtu的指令要多一個,不僅實現了3號命令,也實現了16號命令,這樣我們就可以通過Modbus Tcp讀寫Digi開發板的數據了。這次我們操作的是Digi開發板上的5個LED燈。用OutputPort對象去操作。
操作GPIO的相關代碼如下:
??DataBuff[0]?=?0; ??DataBuff[1]?=?(byte)((output[0].Read()???1?:?0)?|?(output[1].Read()???2?:?0)?|?(output[2].Read()???4?:?0)?|?(output[3].Read()???8?:?0)?|?(output[4].Read()???16?:?0)); ????bool[]?bFlag?=?new?bool[5]; ??bFlag[0]=(DataBuff[1]?&?0x01)>0???true:false; ??bFlag[1]=(DataBuff[1]?&?0x02)>0???true:false; ??bFlag[2]=(DataBuff[1]?&?0x04)>0???true:false; ??bFlag[3]=(DataBuff[1]?&?0x08)>0???true:false; ??bFlag[4]=(DataBuff[1]?&?0x10)>0???true:false; ??for?(i?=?0;?i?<?5;?i++) ??{ ?????output[i].Write(bFlag[i]);? ??} ??? ?? 網絡操作相關源碼如下:
using?System; ??using?Microsoft.SPOT; ??using?System.Net; ??using?System.Net.Sockets; ??using?System.Text; ??using?System.Threading; ??using?Microsoft.SPOT.Hardware; ??? ??namespace?MFModbusTcp ??{ ??????public?class?ModbusTcpSlave ??????{ ????????????????????private?OutputPort[]?output=new?OutputPort[5]; ??????????Cpu.Pin[]?pin?=?new?Cpu.Pin[5]?{?(Cpu.Pin)0,?(Cpu.Pin)1,?(Cpu.Pin)2,?(Cpu.Pin)5,?(Cpu.Pin)6?}; ??????????private?Socket?socketServer; ??????????private?Socket?s?=?null; ??? ????????????????????private?byte[]?m_bytData?=?new?byte[256]; ??????????private?byte[]?m_InputTCPBuf?=?new?byte[1024]; ??????????private?byte[]?m_OutputTCPBuf?=?new?byte[1024]; ??????????public?byte[]?DataBuff?=?new?byte[1024]; ?????????? ????????????????????public?void?Run() ??????????{ ????????????????????????????for?(int?i?=?0;?i?<?5;?i++) ??????????????{ ??????????????????output[i]?=?new?OutputPort(pin[i],?false); ??????????????} ??????????????socketServer?=?new?Socket(AddressFamily.InterNetwork,?SocketType.Stream,?ProtocolType.Tcp); ??????????????socketServer.Bind(new?IPEndPoint(DottedDecimalToIp(0,?0,?0,?0),?502)); ??????????????socketServer.Listen(1); ??????????????Debug.Print("Modbus?Tcp?Slave?Started"); ??????????????while?(true) ??????????????{ ??????????????????s?=?socketServer.Accept(); ??????????????????while?(s?!=?null) ??????????????????{ ??????????????????????if?((int)s.GetSocketOption(SocketOptionLevel.Socket,?SocketOptionName.Error)?!=?0)?goto?ExitServer; ??????????????????????if?(s.Available?>?0) ??????????????????????{ ??????????????????????????TCP_DealwithCommand(); ??????????????????????}????????????? ??????????????????????Thread.Sleep(10); ??????????????????} ??????????????} ???????????ExitServer: ??????????????s.Close(); ??????????????s?=?null; ??????????????Debug.Print("Modbus?Tcp?Slave?Exit"); ??????????} ??? ????????????????????private?void?TCP_DealwithCommand() ??????????{ ??????????????int?i?=?0; ??????????????int?lngSendNum?=?0; ??????????????int?lngDataNum?=?0; ??????????????int?lngDataAddr?=?0; ??? ????????????????????????????int?intRet=s.Receive(m_InputTCPBuf); ????????????????????????????for?(i?=?0;?i?<?12;?i++)?m_OutputTCPBuf[i]?=?m_InputTCPBuf[i]; ??????????????????????????????????????????if?(m_InputTCPBuf[7]?==?3) ??????????????{ ??????????????????…?… ??????????????} ??????????????????????????????????????????if?(m_InputTCPBuf[7]?==?16) ??????????????{ ??????????????????…?… ??????????????} ??????????} ????????????????????private?long?DottedDecimalToIp(byte?a1,?byte?a2,?byte?a3,?byte?a4) ??????????{ ??????????????return?(long)((ulong)a4?<<?24?|?(ulong)a3?<<?16?|?(ulong)a2?<<?8?|?(ulong)a1); ??????????} ??????} ??} ?? 程序部署運行后,我們就可以用標準的Modbus Tcp Client程序測試了,我使用的是YFIOServer。
1、? 先配置Modbus Tcp驅動程序
?
(圖MF071029001.jpg)
2、? 再配置IO連接變量
?
(圖MF071029001.jpg)
3、? 開始讀寫GPIO,此時GPIO燈的亮滅,完全被寫入的數據控制了。
?
(圖MF071029001.jpg)
?
總論:很難想像,操作TCP的代碼比C#的代碼還要簡潔高效,不到十幾分鐘,就把一個C#代碼改造為MF代碼,并且在很短的時間內就調試成功。微軟的下一個戰略看來馬上就成為現實:全世界的每一個智能設備都用MF上網J。
?
?
轉載于:https://blog.51cto.com/yfsoft/323409
總結
以上是生活随笔為你收集整理的.Net Micro Framework研究—TCP/IP通信的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。