ardunio 实现RS485通讯-下位机
#include <SoftwareSerial.h>
SoftwareSerial mySerial(,);
byte ZERO=0x00;
byte Addr=0x03;
byte Status=0x00;
int buffLen=;
char HexTable[] = "0123456789ABCDEF";
int pinTrigger=;
int pinDirection=;
void setup() {
// put your setup code here, to run once:
pinMode(pinDirection,OUTPUT);
digitalWrite(pinDirection,LOW);
pinMode(pinTrigger,OUTPUT);
Off(); mySerial.begin();
Serial.begin();
Serial.println("ok");
} void On(){
digitalWrite(pinTrigger,HIGH);
Status=0x01;
}
void Off(){
digitalWrite(pinTrigger,LOW);
Status=0x00;
} void loop() { byte crc[];
int count=;
byte rBytes[buffLen];
while(mySerial.available()>){
byte b=mySerial.read();
if(count<buffLen){
rBytes[count]=b;
}
count++;
delayMicroseconds();
}
if(count>){
String v= toHex(rBytes,count > buffLen? buffLen : count);
Serial.println("r:" + v);
} if(count<)return;
if(rBytes[] !=Addr)return;
if(count>buffLen)return;
//Send To Me //check crc
calculateCRC(rBytes,count-,crc);
if(crc[]!=rBytes[count-] || crc[] !=rBytes[count-]){
Serial.println("crc error!");
return;
} digitalWrite(pinDirection,HIGH);
byte resp[];
byte respLen=;
//Read status
if(rBytes[]==0x03){
resp[]=Addr;
resp[]=0x03;
resp[]=Status;
respLen=;
}else if(rBytes[]==0x06){ //Write Status
//power on : 03 06 01
//power off: 03 06 00
if(rBytes[]==0x01){
On();
}else{
Off();
}
resp[]=Addr;
resp[]=0x06;
resp[]=Status;
respLen=;
}else{
resp[]=Addr;
resp[]=0x83;
respLen=;
} sendData(resp,respLen);
digitalWrite(pinDirection,LOW); } //================CRC 16==========================
//CRC校验函数
//参数1:待校验数组的起始地址
//参数2:待校验数组的长度
//返回值CRC校验结果,16位,低字节在前
unsigned int calculateCRC(unsigned char* _regs,unsigned char arraySize,byte* crc)
{
unsigned int temp, temp2, flag;
temp = 0xFFFF;
for (unsigned char i = ; i < arraySize; i++)
{
temp = temp ^ *(_regs+i);
for (unsigned char j = ; j <= ; j++)
{
flag = temp & 0x0001;
temp >>= ;
if (flag)
temp ^= 0xA001;
}
}
temp2 = temp >> ; // Serial.print("b:");
// Serial.println(temp,HEX);
// Serial.println((byte)(temp & 0x00FF),HEX);
// Serial.println( (byte)(temp >> 8) ,HEX); temp = (temp << ) | temp2;
temp &= 0xFFFF; crc[]=(byte)(temp >> ) ;
crc[]=(byte)(temp & 0x00FF); return temp;
}
void sendData(byte data[],int count)
{
byte crc[];
calculateCRC(data,count,crc);
for(int i=;i<count;i++){
mySerial.write(data[i]);
}
mySerial.write(crc[]);
mySerial.write(crc[]);
}
//=================================================
//==============byte to hex string===============
String toHex(byte bs[],int count){
String bundle="";
for(int i=;i<count;i++){
bundle += (String)( HexTable[ bs[i] / ]) + (String)( HexTable[bs[i] % ]); }
return bundle;
}
//==============End byte to hex string=============

中间2脚短后连到单片机数字口上,低电位收,高电位发数据
注意左边4脚 是指MUC的,所以串口收发线不需要互换,直接按标识连好。
服务端代码参考:华为网盘中的ZNJM2-20150612.rar
ardunio 实现RS485通讯-下位机的更多相关文章
- C# WPF上位机实现和下位机TCP通讯
下位机使用北京大华程控电源DH1766-1,上位机使用WPF.实现了电压电流实时采集,曲线显示.上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟.昨天写的TCP服务端正好排上用场. 界面如下 ...
- STM32菜鸟成长记录---RS485通讯协议的应用
写作原因:近来蛋闲?非也 ! 昨天一同事合作的项目代码出现的bug-----他的上位机每200ms给我发送命令向我这边下位机读取一些数据,在此过程会按下按键做一些另外操作并给他返回数据:(通信是通 ...
- vb配置下位机CAN寄存器小结
2011-12-14 18:44:32 效果图 1,完成设计(由于没有eeprom等存储设备,所以每次上电后需要通过串口配置某些寄存器).在设计中,列出技术评估难度,并进行尝试,参看<我的设计& ...
- "废物利用"也抄袭——“完全”DIY"绘图仪"<二、下位机程序设计>
就不说怎么组装了吧,一把辛酸泪.说程序,因为这有两把辛酸泪……一把给下位机的C代码一把为了VB.NET的图像处理……不过就上上一篇说的,它们可以正确运行了,并且今天克服了Arduino上电过程中步进电 ...
- C#使用struct直接转换下位机数据
编写上位机与下位机通信的时候,涉及到协议的转换,比较多会使用到二进制.传统的方法,是将数据整体获取到byte数组中,然后逐字节对数据进行解析.这样操作工作量比较大,对于较长数据段更容易计算位置出错. ...
- C#做上位机软件——绘图并传输给下位机
拿到任务之后首先分成了几个部分: 1.绘图.学习了GDI+ 2.图片保存. 3.将图片转换成byte[].由于使用Socket通信,只能传输byte[]数据,所以这一步是向下位机传输的关键. 相应地, ...
- 下位机多个".c, .h"文件的相互包含及排版
一.背景: 自从接触单片机编程以来,由于工作上的需要,不可避免的时常会接手别人的代码,但常常由于上一位同事的编码随意性有点大,导致可读性非常的差,有时候不得不完全舍弃原有代码,推倒重来,无形中增加了工 ...
- MSP430G2333下位机乘法运算需要注意的一个问题
背景: 最近负责为主板管理电源的电源管理模块编写软体,使用的MCU为MSP430G2333.功能上很简单,即通过板子上的硬件拨码设定,或者通过IIC与主板通信,由主板的BIOS决定开机及关机的延时供电 ...
- ROS主题发布订阅控制真实的机器人下位机
先模拟控制小乌龟 新建cmd_node.ccpp文件: #include"ros/ros.h" #include"geometry_msgs/Twist.h" ...
随机推荐
- IE浏览器中的加载项怎么删除
IE浏览器中的加载项是一些软件或者浏览器的功能控件,我们可以通过禁用.开启来控制是否使用某些加载项,同时可以将一些加载项删除. 比如当我们遇到了一些不好的加载项,想要将它删除,通过这篇经验,教大家怎么 ...
- AES 加密256位 错误 java.security.InvalidKeyException: Illegal key size or default parameters
Java发布的运行环境包中的加解密有一定的限制.比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件. 官方网站提供了JCE无限制权限策略文件的下载: JDK8的下载地址: http:/ ...
- python中关键字的总结
python中各种关键字的总结:用表格形式,解释关键字符号的作用和案例说明 关键字 ...
- Linq相关
Linq(语言集成查询) 相关资料如下: 1. Linq语言集成查询 百度百科 2. 30分钟Linq教程 3. Linq查询表达式(C#编程指南) 4. Linq十个常用查询 5. Linq技术专题 ...
- Xtrabackup安装及使用
官方安装步骤:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html 安装percona repo源 ...
- @Repository , @Service , @Controller 和 @Component
用Spring MVC时@Controller注解的类将变成一个Spring MVC的控制器. 不用Spring MVC的情况下, 这四个注解没有区别. 根据注解的语义, 注解在类上面可以提高代码的可 ...
- servlet和JSP页面乱码问题
JSP和Servlet的中文乱码处理 前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下.应该是可以解决日常的乱码问题了.现在作以下总结希望对需要的人有所帮助.我 ...
- JSP复习(part 3 )
3.4.4 request对象提供了一些用来获取客户信息的方法,利用这些方法,可以获取客户端的IP地址 协议等有关信息 3.5 request对象和response对象相对应,用于响应客户请求,由服务 ...
- EasyUI 列表展示及基本格式
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 【英宝通Unity4.0公开课学习 】(二)场景创建
本讲共四节,貌似讲课老师的速度变快了,2倍速听不清了...调成了1.7倍...老师果然越来越熟练了啊! 而且最开始的萌妹纸也不再出现在视频里了,我当时还想着完全可以换成老师自己提问嘛! 不过有妹纸声音 ...