`
isiqi
  • 浏览: 16550687 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

.Net Micro Framework研究—串口操作

阅读更多

.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嵌入式编程(美 汤普逊)

    《Microsoft .NET Micro Framework嵌入式编程》是美国作者汤普逊所著的一本深入探讨.NET Micro Framework(简称.NET MF)技术的专业书籍。这本书旨在帮助读者理解和掌握如何在嵌入式系统中应用.NET Micro Framework...

    《玩转.NET Micro Framework移植-基于STM32F10x处理器》源程序.rar

    《玩转.NET Micro Framework移植-基于STM32F10x处理器》这本书的主题聚焦于将.NET Micro Framework(简称.NET MF)应用到STM32F10x系列微控制器上,这是一个涉及嵌入式系统开发、C#编程以及硬件平台集成的重要技术...

    .Net Micro Framework 移植说明文档

    ### .Net Micro Framework 移植说明文档 #### 概述 .Net Micro Framework(.Net MF)是微软为小型设备设计的一个精简版的.NET框架。它不仅继承了.NET的硬件独立性,还提供了两个关键的抽象层:硬件抽象层(HAL)与...

    GHI .NET Micro Framework培训教材(英文版)

    - **串行接口**:包括UART、SPI、I2C等多种常见的串行通信接口。 - **特殊接口**:如OneWire、CAN等,在特定应用场景下具有重要作用。 #### 九、显示技术与图形界面 - **字符显示屏**:介绍了如何使用字符显示屏...

    .NET Micro Framework开发板使用手册(红牛开发板)

    .NET Micro Framework(简称.NET MF)是微软公司推出的一个嵌入式操作系统平台,主要设计用于资源有限的设备,如物联网(IoT)中的智能硬件、工业自动化设备和消费电子等产品。红牛开发板是一款基于.NET Micro ...

    基于Cortex-M3处理器的.Net Micro Framework移植.pdf

    .NET Micro Framework(MF)是微软为嵌入式系统设计的一种软件框架,它基于.NET平台,提供了操作系统级别的功能,包括启动管理、中断处理、线程调度和内存管理等关键特性。MF设计目标是针对传统的SOC(System on ...

    Apress - Expert .NET Micro Framework (Apr 2008)

    《精通.NET Micro Framework》是一本深入探讨.NET Micro Framework(以下简称.NET MF)的专业书籍,由Apress出版社于2008年4月发行。这本书详细介绍了这个小型化、资源优化的.NET框架,它专为嵌入式设备和物联网(IoT...

    Windows Embedded从入门到精通系列课程(18):.NET Micro Framework——用模拟器零成本体验MF开发

    《Windows Embedded从入门到精通系列课程(18):.NET Micro Framework——用模拟器零成本体验MF开发》 在Windows Embedded技术领域中,.NET Micro Framework(简称.NET MF)是一个专门为小型设备和嵌入式系统设计的...

    GHI .NET MICRO FRAMEWORK入门教程

    ### GHI .NET MICRO FRAMEWORK入门教程 #### 关于本书 本书主要介绍如何利用Microsoft .NET Micro Framework(简称.NETMF)进行嵌入式系统的开发。.NET Micro Framework将.NET平台的强大功能与Visual Studio的高效...

    Microsoft.NET Framework 3.5

    - 面向小型嵌入式系统的 .NET MicroFramework(例如 SPOT 手表); - Silverlight 1.1,用于跨平台、跨浏览器的富互联网应用开发。 #### 二、核心组件 .NET Framework 3.5 包含了大量的类库和功能模块,以下是一些...

    STM32串口ISP下载软件

    STM32串口ISP下载软件是一种实用工具,用于通过串行接口更新STM32微控制器的固件。STM32是意法半导体公司(STMicroelectronics)推出的一系列基于ARM Cortex-M内核的微控制器,广泛应用在嵌入式系统设计中。ISP(In-...

    XBee.rar_XBee-PRO_xbee_xbee api_xbee driver

    在给定的"XBee.rar"压缩包中,包含的"Digi XBee API Driver for .Net microframework"是专门为.NET Micro Framework设计的驱动程序。.NET Micro Framework是一个轻量级的.NET运行时环境,用于开发嵌入式设备和物联网...

    44.zip_.net编程_C#_

    标题中的"44.zip_.net编程_C#"表明这是一个与.NET框架和C#编程语言相关的项目,而描述中提到的"Touch screen data logger for Chipworks board from GHI electronice (.NET micro framework)"则揭示了这个项目具体是...

    InTheHand.Net.Personal

    - **易用性**:通过.NET的类库形式封装蓝牙操作,为开发者提供了一套直观且易于使用的API接口。 - **社区支持**:开发者可以通过下载和使用该库,同时社区的互动留言可以帮助解决使用过程中遇到的问题。 3. **...

    .Net MF 模拟器

    .NET Micro Framework(简称.NET MF)是由微软开发的一个嵌入式操作系统平台,主要针对资源有限的设备,如物联网(IoT)设备、智能家居组件和小型工业控制器。标题中的".Net MF 模拟器"指的是一个用于模拟.NET MF环境...

    InTheHand.Net.Personal.zip

    该库适用于Windows桌面应用程序、Windows Phone以及.NET Micro Framework等多种平台。 在使用`InTheHand.Net.Personal.dll`之前,需要确保你的项目引用了这个库。在Visual Studio中,可以通过右键点击项目,选择...

    第三节:基于C#使用开发板避障模块实验.zip

    这通常需要利用特定的库或API,比如对于.NET Micro Framework,我们可以使用GHI.Hardware库,它提供了对GPIO(通用输入/输出)、PWM(脉宽调制)和SPI(串行外围接口)等硬件功能的访问。对于Windows IoT Core,可能...

    Netduino for vs2017

    这通常包括.NET Micro Framework的运行时库、开发工具、驱动程序以及必要的软件开发套件(SDK)。`.MSI`和`.vsix`文件是安装程序的扩展名。`.MSI`文件是Windows Installer包,用于在Windows操作系统上安装软件。`.vsix...

    蓝牙遥控小车

    使用.NET Micro Framework可以简化复杂的硬件操作,提高开发效率。 #### 三、蓝牙模块设置步骤 1. **开启蓝牙**: 在控制面板中双击蓝牙图标,启动蓝牙服务。 2. **蓝牙设备属性**: 进入蓝牙设备属性面板,查看当前...

Global site tag (gtag.js) - Google Analytics