哪位大神有C#Rs485通讯代码?

作者&投稿:代饰 (若有异议请与网页底部的电邮联系)
c# rs485~

rs485的使用和rs232是一样的,使用上没有区别,设置串口参数,打开串口,读写数据,关闭串口,使用c#自带的组件就可以的,Serialport

C#是做网页的,解释性语言,用它做工控效果不好。
换成真编译的语言:delphi, c++Builder,vc++
用串行通迅,要了解控制器的485对话协议

我有!我是用485转232的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace serial
{
    public class ModBus
    {
       /// <summary>
        /// modbus状态
       /// </summary>
        public static string modbusStatus; 
        /// <summary>
        /// 定义SerialPort变量
        /// </summary>
        public static SerialPort Port = new SerialPort();
        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="m_Port">串口号</param>
        /// <param name="BaudRate">波特率</param>
        /// <param name="m_dataBits">数据位</param>
        /// <param name="m_Parity">奇偶校验</param>
        /// <param name="m_StopBits">停止位</param>
        /// <returns>返回BOOL型,True为成功,False为失败</returns>
        public static bool OpenPort(string m_Port, int BaudRate, int m_dataBits, Parity m_Parity, StopBits m_StopBits) 
        {
            if (Port.IsOpen)
            {
                return true;
            }
            else 
            {
                Port.PortName = m_Port;
                Port.BaudRate = BaudRate;
                Port.DataBits = m_dataBits;
                Port.Parity = m_Parity;
                Port.StopBits = m_StopBits;
                Port.Open();
                if (Port.IsOpen)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
        /// <summary>
        /// 关闭串口
        /// </summary>
        /// <returns>返回BOOL型,True为成功,False为失败</returns>
        public static bool PortClose() 
        {
            if (Port.IsOpen)
            {
                Port.Close();
                return true;
            }
            else 
            {
                return false;
            }        
        }
        public static void GetCRC(byte[] message,  byte[] CRC)
        {
            //Function expects a modbus message of any length as well as a 2 byte CRC array in which to  
            //return the CRC values: 
            ushort CRCFull = 0xFFFF;
            byte CRCHigh = 0xFF, CRCLow = 0xFF;
            char CRCLSB;
            for (int i = 0; i < (message.Length) -2; i++)
            {
                CRCFull = (ushort)(CRCFull ^ message[i]);
                for (int j = 0; j < 8; j++)
                {
                    CRCLSB = (char)(CRCFull & 0x0001);
                    CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);
                    if (CRCLSB == 1)
                        CRCFull = (ushort)(CRCFull ^ 0xA001);
                }
            }
            CRC[1] = CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
            CRC[0] = CRCLow = (byte)(CRCFull & 0xFF);
        }
        /// <summary>
        /// CRC16算法
        /// </summary>
        /// <param name="te">原始数组</param>
        /// <param name="message">保存变量</param>
        public static void BuildMessage(byte[] te, ref byte[] message)
        {
            //Array to receive CRC bytes: 
            byte[] CRC = new byte[2];
            for (int i = 0; i < te.Length; i++) 
            {
                message[i] = te[i];
            }
            GetCRC(message, CRC);
            message[message.Length - 2] = CRC[0];
            message[message.Length - 1] = CRC[1];
        }
        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="m_date">需写入的数据</param>
        /// <param name="type">操作类型0为多输出口控制与open参数不共用,1为单控制口输出open为255时线圈闭合0时线圈释放</param>
        /// <param name="open">1为单控制口输出open为255时线圈闭合0时线圈释放</param>
        /// <returns>返回True或false</returns>
        public static bool SendMessage(byte m_date,int type,bool open=true) 
        {
            if (!Port.IsOpen)
            {
                return false;
            }
            else 
            {
                switch (type) 
                {
                    case 0://多个DO输出控制数据位{ 地址, 功能, 线圈起始地址前位, 线圈起始地址后位, 线圈结束地址前位, 线圈结束地址后位, 数据字节, 线圈状态 };
                        byte[] data = new byte[10];
                        byte[] dd = { 1, 15, 0, 0, 0, 8, 1, m_date };
                        ModBus.BuildMessage(dd, ref data);
                        Port.Write(data, 0, data.Length);
                        break;
                    case 1://单个控制输出{ 地址, 功能, 线圈起始地址前位, 需控制的线圈地址, 开关状态255为开0为关, 线圈开关后位 };
                        byte[] data_one = new byte[8];
                        byte temp0;
                        if (open)
                        { temp0 = 255; }
                        else
                        { temp0 = 0; }
                        byte[] dd1 = { 1, 5, 0, m_date, temp0, 0 };
                        ModBus.BuildMessage(dd1, ref data_one);
                        Port.Write(data_one, 0, data_one.Length);
                        break;
                    case 2:
                         byte[] getsig = new byte[8];
                         byte[] getsige = { 1, 2, 0, 0, 0, m_date };
                         ModBus.BuildMessage(getsige, ref getsig);
                         Port.Write(getsig, 0, getsig.Length);
                        break;
                    case 3:
                        break;              
                
                }
                return true;
            }
        }
        #region Check Response
        private static bool CheckResponse(byte[] response)
        {
            //Perform a basic CRC check: 
            byte[] CRC = new byte[2];
            GetCRC(response,  CRC);
            if (CRC[0] == response[response.Length - 2] && CRC[1] == response[response.Length - 1])
                return true;
            else
                return false;
        }
        #endregion
        #region Get Response
        private static void GetResponse(ref byte[] response)
        {
            //There is a bug in .Net 2.0 DataReceived Event that prevents people from using this 
            //event as an interrupt to handle data (it doesn't fire all of the time).  Therefore 
            //we have to use the ReadByte command for a fixed length as it's been shown to be reliable. 
            for (int i = 0; i < response.Length; i++)
            {
                response[i] = (byte)(Port.ReadByte());
            }
        }
        #endregion 
        public static bool GetModbusData(ref byte[] values) 
        {
            if (Port.IsOpen) 
            {
                int count = Port.BytesToRead;
                if (count > 0)
                {
                    byte[] readBuffer = new byte[count];
                    GetResponse(ref readBuffer);
                    // CRC 验证 
                    if (CheckResponse(readBuffer))
                    {
                        //显示输入数据 
                        values = readBuffer;
                        Port.DiscardInBuffer();
                        return true;
                    }
                    else
                    {
                        Port.DiscardInBuffer();
                        return false;
                    }
                }
                else return false;
            }
            else return false;
        }
   
    }
}


http://download.csdn.net/detail/huandong963/7684417


C语言问题,哪位大神知道?
Value cannot be null,很明显的提示呀,参数name的值不能为空null,给它赋一个不为空的值就行了。拓展:1、NULL,即Null,在C(C++)语言中它是一个无类型指针,并且值通常定义为0。NULL,空字符(也空终止符或空字节,缩写NUL),是一个控制字符与零值。 它存在于许多字符集中,包括ISO \/ IEC 6...

哪位大神能用c语言写一下第一题的程序,按任意键返回菜单继续选择执行和...
include <stdio.h>int main(void){ int menuid; while(1) { printf("1.求两个数的和\\n\\ 2.求两个数的差\\n\\ 3.求两个数的商和余数\\n\\ 4.求两个数的倒数之和\\n\\ \\n\\ 输入0退出系统\\n"); scanf("%d",&menuid); rewind(stdin); switch(men...

哪位大神给我一份c语言题库
2、UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。如1124表示11点24分,而905表示9点5...

哪位大神能告诉我C语言能有什么用?
ddk可以写底层驱动 只要你能想到的 都可以用vc实现 用好c 要了解 计算机系统结构 汇编语言 windows程序设计 深入浅出mfc windows核心编程 等等 需要掌握的多着呢 以为谭浩强版的C语言教程 数据结构就是所有啦 想得太简单了 基本每个方面都有相应的扩展库 够你学的啦 ...

哪位大神有 周杰伦的青花瓷吉他谱 要C调的!! 重点是C调!
哪位大神有 周杰伦的青花瓷吉他谱 要C调的!! 重点是C调! 哪位大神有周杰伦的青花瓷吉他谱要C调的!!重点是C调!C调C调!... 哪位大神有 周杰伦的青花瓷吉他谱要C调的!!重点是C调!C调C调! 展开  我来答 1个回答 #热议# 已婚女性就应该承担家里大部分家务吗?

我想知道有哪位大神可以帮我运行一下这个C语言程序,两个整数的加减乘除...
你要求,输入符号时,符号与前面数字之间不能有空格。例如: 输入 12 3+ 例如: 输入 12 3\/ 另外,考虑程序的除法运算,或带小数点的数的运算,你可以改用浮点数float x,y,z; 格式用 scanf("%f %f %c",&x,&y,&ch); 且在格式 %c 前添个空格,使输入格式灵活,允许 拍入 12 3...

有关C语言数组的问题!给位大神都进来看一下哈!
看这个样子,之所以会用到二维数组,是为了存放平年和闰年的每一个月的天数。a[2][13]也可以是a[2][12](a[2][13]两个数组的第一个都是存放0,a[2][12]两个数组存放的是第一个月份的天数)用 flag=0,就是平年,flag=1,就是闰年。判断是不是闰年,就是:flag=(year%4==0&&year%...

哪位大神有别了夏天C调简谱,挥泪求
由于简谱是用首调唱名法记谱,改变“调号”并不改变乐曲的旋律。因此,你可以用任意的调去演唱或演奏一首乐曲,如下面这首《别了夏天》,谱子上记得是G调,但是你用C调的口琴(或用C调的指法演奏其他乐器)都没有问题,所不同的只是音高的不同,而乐曲的旋律是一样的。

C语言编程问题,哪位大神会做的帮帮忙,感谢!
include <stdio.h> struct Person \/\/声明结构体 { char name[20]; int count; }leader[3]={"li",0,"zhang",0,"sun",0}; \/\/定义结构体数组并初值化 int main() { int i,j; char leader_name[20]; \/\/定义字符数组 printf("请输入候选人名字:li,z...

有没有C语言大神啊,帮写个程序呗。输入一个五位数的正整数,按顺序输出...
1.从个位开始输出 include <stdio.h> int main(int argc, char *argv[]){ int a,n;printf("输入一个五位数正整数:");scanf("%d",&a);while(a>0){n=a%10;printf("%d\\n",n);a=a\/10;} return 0;} 2.从最高(万)位开始输出 include <stdio.h> int main(int argc, char *...

丰润区15982631011: 谁有用C#写的串口通信程序的源代码,就像串口调试助手那种软件,可以实现单片机与PC间的通信的?感激不尽
盛波通络: <p></p> <p>这个是我以前仿照串口调试精灵做的一个串口通讯软件 你看看是不是你想要的效果,想要的话我就把源码发给你(源码可能写的有点乱,那时候刚接触c#和串口通讯)</p>

丰润区15982631011: 求大神用c#帮算下,最好附带解析! -
盛波通络: struct EPoint { public Int32 Row; public Int32 Col;最大值算法...

丰润区15982631011: C#串口通信接受代码,求各位大神帮忙注释下 -
盛波通络: //获取接收缓冲区中数据的字节数 int n= serialPort1.BytesToRead;//定义字节数组buf,长度为接收缓冲区中数据的字节数 byte[] buf = new byte[n];//从 SerialPort 输入缓冲区读取一些字节(长度为buf.Length,缓存区的字节数)并将那些字节写...

丰润区15982631011: 串口 ,vb.net ,C# 使用一个串口,RS485总线,和一个以上模块通讯 -
盛波通络: 你小子!你也太小气了吧,这样的问题一分都不给!上位机采集数据要么是通过IP/TCP 协议(网卡),要么是通过串口获取.你的是通过串口获取.1.定义一个时钟Timer.(时钟周期为你的采集周期)2.在时钟的Tick事件里写采集数据代码.(SerialPort类)

丰润区15982631011: 用c#实现串口通信设计,有好多弄不清楚啊,求大神指教啊!!!
盛波通络: 文本框输入数据,传输前在数据前加上帧头帧尾,信息位这些东西. 另一方,接收端收到所有数据,解析,去掉帧头帧尾、信息位,再将最后的数据显示出来. 你说的完全正确.

丰润区15982631011: C#作业,哪位大神有源代码,发我一份!有注释最好! -
盛波通络: 花了近1小时完成的(我这的vs2010有问题..郁闷..) 一定要采纳啊!代码如下----------------------------------------------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using ...

丰润区15982631011: PIC单片机UART转RS485的c语言编程 -
盛波通络: PIC单片机485通讯的C语言程序,绝对好用的程序 http://www.pudn.com/downloads190/sourcecode/app/detail891715.html pic单片机与PC机的485通信程序,实现了232转485的功能 http://www.pudn.com/downloads81/sourcecode/embed/detail315363.html485通信的应用有PIC源程序与协议说明 http://wenku.baidu.com/view/72356a2a7375a417866f8f0e.html

丰润区15982631011: 求C++ C语言大神帮忙弄一个串口通信的代码 -
盛波通络: 这是我以前写的一个串口通讯文件,全部贴出来了,希望对你有帮助,包括设置,发送,接受数据,你可以好好看看,祝你成功// 串口Dlg.cpp : 实现文件//#inclu...

丰润区15982631011: 哪位朋友有modbus通讯协议编写成C++代码,指导一下 -
盛波通络: 1. 发送报文的数组当然是byte数组,至于如何组织数据,首先要定义好需要支持的命令; 2. 其次,用通用的通信测试软件,验证你的命令,像格西烽火之类的软件,自定义功能比较强,花在测试验证的时间少一点; 3. 再次,就是把验证好的命令填入代码.

丰润区15982631011: 哪位大神帮忙看看这段c++代码? -
盛波通络: 有如下错误:(1)double getDistance(Point a,Point b){ return sqrt((a.x-b.x)^2+(a.y-b.y)^2); //error}因为^在C/C++中是异或运算符,而且要求操作数必须是整数.x,y是...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网