哪位大神有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 *...
盛波通络: <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是...