.Net Micro Framework研究—串口操作
试验平台:Digi MF开发板
Digi提供的示例中包含了串口的示例程序,主要代码如下:
publicboolEchoByte()
{
SerialPortserial;
boolexceptionRaised=false;
booltestResult=true;
stringmessage=" Thisisanechotest.Enterthecharactertoecho,orESCtoexit. ";
byte[]encodedMessage=c_encoding.GetBytes(message);
byte[]buffer=newbyte[1];
try
{
serial=newSerialPort(newSerialPort.Configuration(Cpu.Serial.COM1,Cpu.BaudRate.Baud115200,false));
serial.Write(encodedMessage,0,message.Length);
while(buffer[0]!=0x1b)
{
serial.Read(buffer,0,buffer.Length,Timeout.Infinite);
serial.Write(buffer,0,buffer.Length);
}
serial.Dispose();
}
catch
{
exceptionRaised=true;
}
if(exceptionRaised==true)
testResult=false;
returntestResult;
}
部署运行后,你可以用超级终端进行测试,测试图如下:
(图MF10280001.JPG)
注意:如果串口程序非正常退出,有可能导致开发板无法发送数据(接收倒是正常),重启开发板即可。
用测试程序还是体现不出.Net Micro Framework的优势,我决定用MF实现Modbus Rtu Slave服务端(支持Modbus Rtu 3号命令),并且地址为0的数据存放了GPIO入的信息,这样在上位机就很方面的检测IO信号了。
用了大约15分钟,就把我以前用C++开发的Modbus Rtu Slave程序移植到MF平台上来的,我想如果用单片来开发,虽然也有可能借用以前的代码,但很方便的把IO信号也非常快捷的集成进来,恐怕不容易。
值得一提的是VS2005 的调试功能非常强大,很容易添加断点及监控当前变量的值,同时用debug.print()命令也非常好使,这样调试程序绝对比调试单片舒服。
下面贴出我写的Modbus RtuSlave代码
usingSystem;
usingMicrosoft.SPOT;
usingSystem.Threading;
usingMicrosoft.SPOT.Hardware;
namespaceMFModbus
{
publicclassModbusRtu
{
privateThreadm_worker;
privateboolm_RunFlag;
privatebytebytRtuDataFlag=0;
privatebytebytRtuDataIdx;
privatebyte[]bytRtuData=newbyte[8];
//设备地址,默认为1
privatebyteModbusAddr=1;
//数据区(注意,Modbus读写是以字(双字节)为单位的)
privatebyte[]DataBuff=newbyte[128];
SerialPortserial=null;
InputPort[]input=newInputPort[5];
Cpu.Pin[]pin=newCpu.Pin[5]{(Cpu.Pin)0,(Cpu.Pin)1,(Cpu.Pin)2,(Cpu.Pin)5,(Cpu.Pin)6};
publicModbusRtu(bytemModbusAddr)
{
ModbusAddr=mModbusAddr;
for(inti=0;i<5;i++)
{
input[i]=newInputPort(pin[i],false,Port.ResistorMode.PullUp);
}
}
~ModbusRtu()
{
Stop();
}
//CRC16校验
privateUInt16GetCheckCode(byte[]buf,intnEnd)
{
UInt16crc=(UInt16)0xffff;
inti,j;
for(i=0;i<nEnd;i++)
{
crc^=(UInt16)buf[i];
for(j=0;j<8;j++)
{
if((crc&1)!=0)
{
crc>>=1;
crc^=0xA001;
}
else
crc>>=1;
}
}
returncrc;
}
//启动Modbus服务
publicvoidRun()
{
try
{
//仅有波特率选项,竟然没有奇偶校验控制
serial=newSerialPort(newSerialPort.Configuration(Serial.COM1,BaudRate.Baud9600,false));
Debug.Print("OpenSerialOK");
m_worker=newThread(newThreadStart(this.ModbusThreadProc));
m_RunFlag=true;
m_worker.Start();
}
catch
{
Debug.Print("SerialError");
}
}
//停止Modbus服务
publicvoidStop()
{
m_RunFlag=false;
if(serial!=null)
serial.Dispose();
}
//ModbusSlave服务
privatevoidModbusThreadProc()
{
Debug.Print("StartModbusSlave");
byte[]bytData=newbyte[1];
while(m_RunFlag)
{
serial.Read(bytData,0,bytData.Length,Timeout.Infinite);
RtuSlave(bytData[0]);
}
}
//串口数据处理
privatevoidRtuSlave(bytebytData)
{
//Debug.Print(bytRtuDataIdx.ToString()+"-"+bytData.ToString());
if(bytRtuDataFlag==0)
{
//如果数据为首地址
if(bytData==ModbusAddr)
{
bytRtuDataFlag=1;
bytRtuDataIdx=0;
bytRtuData[bytRtuDataIdx++]=bytData;
}
}
else
{
bytRtuData[bytRtuDataIdx++]=bytData;
if(bytRtuDataIdx>=8)
{
//信息处理
UInt16intCRC16=GetCheckCode(bytRtuData,8-2);
//Debug.Print("CRC:"+bytRtuData[8-2].ToString()+""+((byte)(intCRC16&0xFF)).ToString()+"|"+bytRtuData[8-1].ToString()+""+((byte)((intCRC16>>8)&0xff)).ToString());
//CRC16校验检验
if(bytRtuData[8-2]==(intCRC16&0xFF)&&bytRtuData[8-1]==((intCRC16>>8)&0xff))
{
byte[]bytSendData=newbyte[255];
bytebytErrorFlag=0;
bytebytErrorNo=1;
//Debug.Print("CRCOK");
//读数据
if(bytRtuData[1]==3)
{
UInt16lngDataAddr=bytRtuData[2];
lngDataAddr=(UInt16)((lngDataAddr<<8)+bytRtuData[3]);//地址
UInt16lngDataNum=bytRtuData[4];
lngDataNum=(UInt16)((lngDataNum<<8)+bytRtuData[5]);//数量
if(lngDataAddr*2+lngDataNum*2>1024||lngDataNum>120)
{
bytErrorNo=2;
bytErrorFlag=0;
}
else
{
bytSendData[0]=bytRtuData[0];
bytSendData[1]=bytRtuData[1];
bytSendData[2]=(byte)(lngDataNum*2);
//读GPIO信号
DataBuff[0]=0;
DataBuff[1]=(byte)((input[0].Read()?1:0)|(input[1].Read()?2:0)|(input[2].Read()?4:0)|(input[3].Read()?8:0)|(input[4].Read()?16:0));
for(inti=0;i<bytSendData[2];i++)
{
bytSendData[3+i]=DataBuff[lngDataAddr*2+i];
}
intCRC16=GetCheckCode(bytSendData,3+lngDataNum*2);
bytSendData[3+lngDataNum*2]=(byte)(intCRC16&0xFF);//CRC校验低位
bytSendData[4+lngDataNum*2]=(byte)((intCRC16>>8)&0xff);//CRC校验高位
//发送数据
intintRet=serial.Write(bytSendData,0,5+lngDataNum*2);
//Debug.Print("SendDataOK"+intRet.ToString());
bytErrorFlag=1;
}
}
if(bytErrorFlag==0)
{
//协议不支持
bytSendData[0]=bytRtuData[0];
bytSendData[1]=(byte)(bytRtuData[1]|0x80);
bytSendData[2]=bytErrorNo;
intCRC16=GetCheckCode(bytSendData,3);
bytSendData[3]=(byte)(intCRC16&0xFF);//CRC校验低位
bytSendData[4]=(byte)((intCRC16>>8)&0xff);//CRC校验高位
//发送数据
serial.Write(bytSendData,0,5);
}
}
bytRtuDataFlag=0;
}
}
return;
}
//串口号
publicstaticclassSerial
{
publicconstSerialPort.SerialCOM1=(SerialPort.Serial)0;
publicconstSerialPort.SerialCOM2=(SerialPort.Serial)1;
}
//串口波特率
publicstaticclassBaudRate
{
publicconstSerialPort.BaudRateBaud4800=(SerialPort.BaudRate)4800;
publicconstSerialPort.BaudRateBaud9600=(SerialPort.BaudRate)9600;
publicconstSerialPort.BaudRateBaud19200=(SerialPort.BaudRate)19200;
publicconstSerialPort.BaudRateBaud38400=(SerialPort.BaudRate)38400;
publicconstSerialPort.BaudRateBaud57600=(SerialPort.BaudRate)57600;
publicconstSerialPort.BaudRateBaud115200=(SerialPort.BaudRate)115200;
publicconstSerialPort.BaudRateBaud230400=(SerialPort.BaudRate)230400;
}
}
}
程序部署运行后,直接用标准的Modbus Rtu客户端程序测试即可,我用的是我以前编写的Modbus Rtu Client程序,测试如下:
(图MF10280002.JPG)
这时候,你直接操作SW2的拨码,该数字就会发生变化(前提SW1的拨码都拨到右边)。
缺点:很奇怪的是串口的参数仅能配置波特率,奇偶校验,数据位却无法配置。
总的印象:用MF开发嵌入式系统还是非常有前景的,至少使产品的开发周期大大缩短,并且代码升级维护方便。
分享到:
相关推荐
《Microsoft .NET Micro Framework嵌入式编程》是美国作者汤普逊所著的一本深入探讨.NET Micro Framework(简称.NET MF)技术的专业书籍。这本书旨在帮助读者理解和掌握如何在嵌入式系统中应用.NET Micro Framework...
《玩转.NET Micro Framework移植-基于STM32F10x处理器》这本书的主题聚焦于将.NET Micro Framework(简称.NET MF)应用到STM32F10x系列微控制器上,这是一个涉及嵌入式系统开发、C#编程以及硬件平台集成的重要技术...
### .Net Micro Framework 移植说明文档 #### 概述 .Net Micro Framework(.Net MF)是微软为小型设备设计的一个精简版的.NET框架。它不仅继承了.NET的硬件独立性,还提供了两个关键的抽象层:硬件抽象层(HAL)与...
- **串行接口**:包括UART、SPI、I2C等多种常见的串行通信接口。 - **特殊接口**:如OneWire、CAN等,在特定应用场景下具有重要作用。 #### 九、显示技术与图形界面 - **字符显示屏**:介绍了如何使用字符显示屏...
.NET Micro Framework(简称.NET MF)是微软公司推出的一个嵌入式操作系统平台,主要设计用于资源有限的设备,如物联网(IoT)中的智能硬件、工业自动化设备和消费电子等产品。红牛开发板是一款基于.NET Micro ...
.NET Micro Framework(MF)是微软为嵌入式系统设计的一种软件框架,它基于.NET平台,提供了操作系统级别的功能,包括启动管理、中断处理、线程调度和内存管理等关键特性。MF设计目标是针对传统的SOC(System on ...
《精通.NET Micro Framework》是一本深入探讨.NET Micro Framework(以下简称.NET MF)的专业书籍,由Apress出版社于2008年4月发行。这本书详细介绍了这个小型化、资源优化的.NET框架,它专为嵌入式设备和物联网(IoT...
《Windows Embedded从入门到精通系列课程(18):.NET Micro Framework——用模拟器零成本体验MF开发》 在Windows Embedded技术领域中,.NET Micro Framework(简称.NET MF)是一个专门为小型设备和嵌入式系统设计的...
### GHI .NET MICRO FRAMEWORK入门教程 #### 关于本书 本书主要介绍如何利用Microsoft .NET Micro Framework(简称.NETMF)进行嵌入式系统的开发。.NET Micro Framework将.NET平台的强大功能与Visual Studio的高效...
- 面向小型嵌入式系统的 .NET MicroFramework(例如 SPOT 手表); - Silverlight 1.1,用于跨平台、跨浏览器的富互联网应用开发。 #### 二、核心组件 .NET Framework 3.5 包含了大量的类库和功能模块,以下是一些...
STM32串口ISP下载软件是一种实用工具,用于通过串行接口更新STM32微控制器的固件。STM32是意法半导体公司(STMicroelectronics)推出的一系列基于ARM Cortex-M内核的微控制器,广泛应用在嵌入式系统设计中。ISP(In-...
在给定的"XBee.rar"压缩包中,包含的"Digi XBee API Driver for .Net microframework"是专门为.NET Micro Framework设计的驱动程序。.NET Micro Framework是一个轻量级的.NET运行时环境,用于开发嵌入式设备和物联网...
标题中的"44.zip_.net编程_C#"表明这是一个与.NET框架和C#编程语言相关的项目,而描述中提到的"Touch screen data logger for Chipworks board from GHI electronice (.NET micro framework)"则揭示了这个项目具体是...
- **易用性**:通过.NET的类库形式封装蓝牙操作,为开发者提供了一套直观且易于使用的API接口。 - **社区支持**:开发者可以通过下载和使用该库,同时社区的互动留言可以帮助解决使用过程中遇到的问题。 3. **...
.NET Micro Framework(简称.NET MF)是由微软开发的一个嵌入式操作系统平台,主要针对资源有限的设备,如物联网(IoT)设备、智能家居组件和小型工业控制器。标题中的".Net MF 模拟器"指的是一个用于模拟.NET MF环境...
该库适用于Windows桌面应用程序、Windows Phone以及.NET Micro Framework等多种平台。 在使用`InTheHand.Net.Personal.dll`之前,需要确保你的项目引用了这个库。在Visual Studio中,可以通过右键点击项目,选择...
这通常需要利用特定的库或API,比如对于.NET Micro Framework,我们可以使用GHI.Hardware库,它提供了对GPIO(通用输入/输出)、PWM(脉宽调制)和SPI(串行外围接口)等硬件功能的访问。对于Windows IoT Core,可能...
这通常包括.NET Micro Framework的运行时库、开发工具、驱动程序以及必要的软件开发套件(SDK)。`.MSI`和`.vsix`文件是安装程序的扩展名。`.MSI`文件是Windows Installer包,用于在Windows操作系统上安装软件。`.vsix...
使用.NET Micro Framework可以简化复杂的硬件操作,提高开发效率。 #### 三、蓝牙模块设置步骤 1. **开启蓝牙**: 在控制面板中双击蓝牙图标,启动蓝牙服务。 2. **蓝牙设备属性**: 进入蓝牙设备属性面板,查看当前...