精华内容
下载资源
问答
  • 关于Arduino Mega 2560串口的一些蛋疼问题1 等待串口连接的代码段必须使用官方串口监视器才能激活如下面的代码段,如果使用普通串口助手在程序刚上传后、板子复位或USB线重新插拔后都会接收不到 ”Hello World!...

    关于Arduino Mega 2560串口的一些蛋疼问题


    1 等待串口连接的代码段必须使用官方串口监视器才能激活

    如下面的代码段,如果使用普通串口助手在程序刚上传后、板子复位或USB线重新插拔后都会接收不到 ”Hello World!” ,也就是说程序运行不正常,而使用官方的串口监视器则没有这个问题。现在的解决办法是先使用官方的串口监视器先打开板子串口一下,紧接着在使用普通串口助手就可以打开了。本人纠结这个事情是因为自己在MFC中使用CSerial类编写的上位机软件和普通串口助手的情况一致。

    void setup() {
        Serial.begin(9600,SERIAL_8N1);
        while (!Serial) {
            ; // wait for serial port to connect. Needed for native USB port only
        }
        //////////////////////////////向上位机传输下位机的初始化信息
        Serial.println("Hello World!!");
    }

    2 检测上位机命令的代码段的莫名其妙的问题

    其代码段为:

    String chString;//字符型字符串,用于储存上位机的命令
    String valString;//用于储存上位机传来的数字信息
    void checkState(double &vel_aim)
    {
        char ch;
        while (Serial.available() > 0)
        {
            ch = Serial.read();
            chString += ch;
            if (isDigit(ch) || '.'==ch)
            {
                valString += ch;
            }
    /************************************************************************/
    /* 下面的三行代码,在官方的串口监视器上可以注销的,但是在普通的串口助手和
    /* 咱们自己的软件也是有问题,这个问题,我们先不去解决吧,先赶进度
    /************************************************************************/  
           Serial.print("+++");
           Serial.print(ch);
           Serial.println("+++");
    /***********************************************************************/
    
           delay(1);//这个delay必须有,不然会出错,就会跳出while循环
        }
    //   delay(5);//这个是以前delay的,应该是有用的吧,这个地方需要测试
        if (chString.startsWith("S"))
        {
            isStart = true;
            isFirstLoop = true;
            isEnd = false;
    //      Serial.println("+++"+chString+"+++");
        }
        else if (chString.startsWith("E"))
        {
            isStart = false;
            isFirstLoop = false;
            isEnd = true;
    //      Serial.println("+++"+chString+"+++");
        }
        else if (chString.startsWith("$"))
        {
            //todo here is the programm to set targetSpeed and pwm
            //123.123就会变成123.12
            vel_aim = valString.toFloat();
    //      Serial.print("+++"+valString+"+++");
        }
        chString = "";
        valString = "";
    }
    void loop() {
        checkState(vel_aim);
    }

    在上面的代码段中,下面的几行代码是必须的,器原因如注释所示:

    /************************************************************************/
    /* 下面的三行代码,在官方的串口监视器上可以注销的,但是在普通的串口助手和
    /* 咱们自己的软件也是有问题,这个问题,我们先不去解决吧,先赶进度
    /************************************************************************/  
           Serial.print("+++");
           Serial.print(ch);
           Serial.println("+++");
    /***********************************************************************/
    
           delay(1);//这个delay必须有,不然会出错,就会跳出while循环

    其中那个delay(1),如果没有的话它会直接跳出while循环,不管有几个字符,剩下的那三行代码是在我试验的时候加的,如果不加这三行代码,程序就运行不正常,这个以后再试验得出结果吧。
    PLUS: 这是我第一次使用MarkDown进行编辑,感觉还不错吧,以后再尝试使用

    展开全文
  • 树莓派通过串口arduino mega 2560通信

    千次阅读 2016-08-07 11:49:58
    树莓派通过串口arduino mega 2560通信 树莓派通过串口arduino mega 2560发送文件保存在内存卡上 我的树莓派3装的官方镜像Raspbian 选用arduino mega 2560是因为我的作品需要的引脚比较多,这只是其中一部分 ...

    树莓派通过串口与arduino mega 2560通信

    树莓派通过串口给arduino mega 2560发送文件保存在内存卡上的所有操作,也没准不是所有

    • 我的树莓派3装的官方镜像Raspbian
    • 选用arduino mega 2560是因为我的作品需要的引脚比较多,这只是其中一部分
    • 据说SD.h库支持的内存卡最好不要超过2G,但是我用的8G,此处指的arduino所连接的内存卡
    • Linux串口是用minicom
    • 内存卡读卡器买某宝带了电平转换的5v的使用spi总线
    • arduino与树莓派直接通过usb串口,把arduino的usb直接插到树莓派上,靠树莓派来供电
    • 全文Linux指的是树莓派板上系统

    树莓派准备

    我用三代B是因为自带wifi,我的作品需要wifi,3代之前的不带wifi,需要下载镜像http://www.raspberrypi.org/,我向来下载最新的,什么新特性自己感悟才是硬道理,找个读卡器装上内存卡,推荐Class10及更好,c4卡卡到爆深有体会,在2代B+相当明显,山寨卡更是不行!把下载的镜像解压使用Win32DiskImager把img镜像写入到内存卡,成功之后你的fat32部分只有几十兆,上电开机,推荐2A的适配器,二代时候就这么说了,照做就是。刚好我的三星带的是2A充电器,从2代开始我就是这个,毕竟我是穷逼,s4用到现在,都快毕业了,也不是说打广告,我就是喜欢三星功能多,咱们理工的就应该这种,倒腾个NFC,人家有,没事开可以给公交卡充点钱(我可没干过);热了开个空调,要红外,人家有,你别跟我说用个红外管焊在耳机插头上用音频载波38k也可以,你这就是抬扛了。
    上电之后你用一百种方法让对它操作(夸张夸张),我最先二代时候用的hdmi转vga,vga还要额外供电,毕竟不能回家用hdmi接上大彩电(倒是试过),我当初是因为转所谓的win10 IOT版,不过看过之后觉得大失所望,而且hdmi转vga为了省钱我买的一共四五十那种,质量垃圾的一比,玩玩就坏了,usb还要开焊(提一下我这个带音频输出,其实我是想让店家送个音频线插在音箱和笔记本之间放歌的。。。)。当然你可以给他买个屏幕,说实话不值得。最实用当然最吊丝的是最传统的远程(然而我就是这种吊丝),远程需要什么?ip啊!账户啊!密码啊!树莓派的作者有先见之明帮你把普通用户的账户密码的创建好了,账户:pi密码:raspberry 其实也是多好记的,简单粗暴;但是上电一般来说不好确定他的ip,毕竟镜像是你自己安装的,但是你还没有对它操作,那么现在咱们开始:1.最穷逼:直连。只需要一条网线,树莓派和pc用网线直接连,你说你没有网线,那你可以要饭去了(除非你有路由器,多天线、穿墙,信号好,牛逼,哈哈,推荐个极路由,主要是可折腾,当然你说你普通你一可以装个openwrt那你就是抬扛了),网线直连也是互相看不到的,你别看到这里直接连好了arp -a了半天没找到大骂我骗人,这时候你把树莓派断电取下内存卡插到pc上,打开里面有个cmdline.txt,这个文件名字起的我感觉是怪的不行,令人费解,打开之后:

     dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

    把你的ip填写进去,这样方便我们连接的时候填写host,添加后的效果:

    dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes ip=192.168.4.100 rootwait

    这时候把pc的ip也填写一个同一网段的,我一般直接192.168.4.99,离得近,心理上感觉亲近,哈哈
    ,这时候你可以用putty啦、SecureCRT啦、WinSCP(winscp里可以调用putty)啦都可以,我一般习惯winscp传文件,SecureCRT控制台,毕竟当时我们嵌入式的老师用这俩,老师的影响还真是意义深远。账户:pi密码:raspberry,再说一次,当然你想看见xwindow,也是可以的,就远程嘛、这时候你可以在控制台输入:

    sudo apt-get install tightvncserver

    出现y/s按y,这傻子也会,比如说我这种,但是你不会出现,因为你没联网!所以要么你自己pc上下载好,传到树莓派上,但是你总不能缺啥还得提前下载一个吧,咱们学it就是为了让复杂的东西简单化,所以,这里使用第二种连接方式。2,通过路由器。第一种方法我之所以ip段是4,因为我这个路由器自动分配的4,(说我可以改啊,那你又是抬扛了),连到同一路由器,这个时候咱们就可以同时上网啦,不过在学校的话可以能会碰到校园网,有的学校是城市热点的dr.com或者锐捷,我们学校的城市热点的dr.com,可以把你的ip填写到路由器之后pc和树莓派都连到路由器上,pc登录dr.com之后两者就都可以上网啦(pc最最好自动寻找ip,然后分配之后再给树莓派分配同一ip段的ip),这时候你就可以尽情的安装啦,安装了tightvncserver之后他会提示你输入密码,输入两次八位的后面要用到,配置成功后,输入命令:

    sudo raspi-config

    这时候进入了树莓派的配置菜单,是个理论上的图形化界面,哈哈,翻到ssh,enable开启ssh,退出之后,直接输入

    tightvncserver

    他就会提示你啥啥啥,已经建立了一个xwindow,其实就是开启了vnc服务,你可以访问啦。那么你这时候在pc上下载一个tightvncview,安装时候不用安装server部分、也就是服务端,我当时就是傻的点的快,给装上了,到输密码那里我才反应过来(跟树莓派上安装要密码那一个意思),多了个安全风险,(就我这彩也没啥提安全的资格),安装完之后启动tightvncviewer,输入ip,你的密码就是你刚刚树莓派安装时输入的八位数字【注意:这里直接就可以登录,不会用到系统密码!所以你的服务器最好不要用这个】,图形化界面就有了,说实话没啥卵用,只是用来看看里面啥样的,满足一下好奇心。
    下面安装minicom,(minicom只是用来调试串口,可装可不装),看名字就知道是个弄串口的(实际上是公司的名字),上来就是在线安装:

    sudo apt-get install minicom
    

    安装完之后进入配置:

    minicom -s

    里面有个Serial port setup,就是串口设置,有个abcd为序号的啥啥啥,(之前我的桌面centos 7没有B,也就那个文件锁的条目,直接空出来),按几就会跳到几

                 A — Serial Device : /dev/ACM0  arduino串口
                 B — lockfile Location : /var/lock 我理解的是文件锁,防止出现同时读写
                 C — Calling Program : 
                 D — Callout Program: 
                 E — Bps/par/Bits : 115200 8N1 波特率
                 F — Hardware Flow Control : NO 我把硬件流控制这个关了
                 G — Software Flow Control : NO 

    保存Save setup as df1。

    查看arduino相关串口

    因为linux下设备是当做目录来看的,我们直接

    ls -l /dev/ttyS*

    一般来说arduino的串口是AMA0,有时候也会是1或者等等,前提是你必须把arduino插上,才会在控制台看到这个串口的名字,这个时候为了方便调试,你可以在树莓派的系统上安装一个arduino ide(可以通过vnc从图形界面里面的安装程序功能添加),与windows的界面是一模一样的,自带的串口监视器也是可以用的
    先写到这里吧,因为到这里我已经离开了这个开发,linux上用java写的服务端,安卓上也得客户端,把文件发送到linux上之后,python写的脚本检测特定目录下文件,然后把文件通过串口发送到mega(前提示文件不能太大,串口通信带宽有限的很,我发的是二进制文件,比较好出处理)mega使用sd.h库存储到内存卡上。。

    展开全文
  • Arduino MEGA2560串口使用方法

    万次阅读 2019-01-13 23:55:07
    通常将Arduino上自带的串口称为硬串口,而使用SoftwareSerial类库模拟成的串口称为软串口。软串口是由程序模拟生成的,使用起来没有硬串口稳定,而且和硬串口一样,波特率越高越不稳定。  软串口通过AVR芯片的...

            通常将Arduino上自带的串口称为硬串口,而使用SoftwareSerial类库模拟成的串口称为软串口。软串口是由程序模拟生成的,使用起来没有硬串口稳定,而且和硬串口一样,波特率越高越不稳定。

            软串口通过AVR芯片的PCINT中断功能来实现,在Arduino UNO上,所有引脚都支持PCINT中断,因此所有引脚都可设置为RX接收端。但是在Arduino MEGA上能被设置为RX的引脚有10,11,12,13,50,51,52,53,62,63,64,65,66,67,68,69。在Arduino Leonardo上能被设置为RX的引脚有8,9,10,11,14(MISO),15(SCK),16(MOSI)。

            本文采用两块Arduino MEGA板子做实验,A板使用Serilal串口和电脑1通信,Serial1串口和B板通信;B板使用Serial和电脑2通信,软串口(10,11引脚分别为RX,TX)和A板通信。接线关系为:

    A板B板

    18 TX1

    10
    19 RX111

    A板程序为:

    void setup()
    {
      Serial.begin(9600); 
      Serial1.begin(9600); 
    }
    String device_A_String = "";
    String device_B_String = "";
    void loop()
    {
      if (Serial.available() > 0) 
      {
        if(Serial.peek() != '\n')
        {
          device_A_String += (char)Serial.read();
        }
        else
        {
          Serial.read();
          Serial.print("you said:");
          Serial1.println(device_A_String);
          Serial.println(device_A_String);
          device_A_String = "";
        }
      }
      if (Serial1.available() > 0)
      {
        if(Serial1.peek() != '\n')
        {
          device_B_String += (char)Serial1.read();
        }
        else
        {
          Serial1.read();
          Serial.print("device B said:");
          Serial.println(device_B_String);
          device_B_String = "";
        }
      }
    }

    B板程序为:

    #include <SoftwareSerial.h>
    SoftwareSerial softSerial(10,11); //定义虚拟串口名为serial,rx为10号端口,tx为11号端口
    void setup()
    {
      softSerial.begin(9600); //初始化虚拟串口
      Serial.begin(9600); //初始化Arduino默认串口
      softSerial.listen();
      Serial.println(softSerial.isListening());
    }
    String device_A_String = "";
    String device_B_String = "";
    void loop()
    {
      if (Serial.available() > 0)
      {
        if(Serial.peek() != '\n')
        {
          device_B_String += (char)Serial.read();
        }
        else
        {
          Serial.read();
          Serial.print("you said:");
          Serial.println(device_B_String);
          softSerial.println(device_B_String);
          device_B_String = "";
        }
      }
      
      if (softSerial.available() > 0) 
      {
        if(softSerial.peek() != '\n')
        {
          device_A_String += (char)softSerial.read();
        }
        else
        {
          softSerial.read();
          Serial.print("device A said:");
          Serial.println(device_A_String);
          device_A_String = "";
        }
      }
    }

    展开全文
  • 如果觉得我写的还行,记得关注本人博客并点赞呦,第一次写博客,还请各位多多包涵,本篇文章主要为大家展示了Arduino mega 2560与Uno板子基于Modbus协议双向通信的实现过程。 内容如下 Arduino mega 2560主板 ...

    基于Modbus协议的板间通信

    大家好! 如果觉得我写的还行,记得关注本人博客并点赞呦,第一次写博客,还请各位多多包涵,本篇文章主要为大家展示了Arduino mega 2560与Uno板子基于Modbus协议双向通信的实现过程。

    内容如下

    1. Arduino mega 2560主板
    2. Arduino uno 从板
    3. CRC校验算法
    4. 总结

    1 .Arduino mega 2560 主板

    我们将Arduino mega 2560作为主板,用它向从板Uno发送经过Modbus协议打包后的消息帧,我们在此使用RTU消息帧模式,将要发送的消息帧定义成五位数组的模式,包括8bit主板地址码,8bit功能码,8bit数据位及16bit的CRC校验码,利用CRC校验保证传输消息的正确性,消息帧中的功能码则对应与从板的不同功能,在收到功能码后从板执行对应功能 。

    Arduino mega 2560 主板主要代码

    主板上消息帧发送部分的代码如下:

    void SendFrameA()  //帧发送函数
     {
        
       int bufferSize=3;  
       int h;
       crc=calculateCRC(&buffer[0],bufferSize);  //crc计算 并把结果装到buffer数组中
       buffer[bufferSize]=crc&0x00ff;  //低字节先加入
       bufferSize++;
       buffer[bufferSize]=crc>>8;  //高字节后加入
       bufferSize++;
    
       Send(&buffer[0],bufferSize); //调用发送函数 
    
       Serial.print("Send buffer:0x");  //串口显示
       for(h=0;h<5;h++)
         {
           Serial.print(buffer[h],HEX);
           delay(10);
         }
         Serial.println(" ");
     }
     
     void Send(uint8_t* data,uint8_t arraySize) //发送函数 按位发送
     {
      for(int i=0;i<arraySize;i++)
      {
        Serial2.write(*(data+i));      
      }
     }
    

    2. Arduino uno 从板

    Arduino uno作为我们的从板部分,用它接我们的外设部分,即配套的功能扩展板,在这部分我们依据Modbus协议定义了接收部分的函数,在该板收到主板所发送的消息帧后提取其中的功能码,并依据接收到的消息算出新的CRC,并将其与主板发送来的CRC进行比较,如果两者相同,就代表传输无误,便执行功能码对应的功能,如果两者不同,则返回错误信息,从而使主板重发消息,功能在执行完毕后也向主板发送返回信息,并使主板根据其返回信息 显示通信完成与否。

    Arduino uno 从板主要代码

    从板上消息帧接收部分的代码如下:

    int8_t Receive()  //接收函数
    {
      int recSize;
      unsigned int recrc;
      
      if(Serial2.available()==0)
      {
        return 0;
      }
      delay(15);
      recSize=0;
      while(Serial2.available() > 0)
      {
        recBuffer[recSize] = Serial2.read();
        recSize++;
      }
      recrc=((recBuffer[recSize - 1]<<8)|recBuffer[recSize - 2]);
      
       if(calculateCRC(&recBuffer[0],recSize - 2)==recrc) //CRC帧检测
       {
         int k;
         Serial.print("Receive buffer:0x");
         for(k=0;k<5;k++)
         {
           Serial.print(recBuffer[k],HEX);
           delay(10);
         }
         Serial.println(" ");
         switch(recBuffer[1])  //根据接受的消息中的功能码 选择执行相应功能
         {
           case 0x10: RUNLED();break;
           case 0x20: Temp();break;
           case 0x30: RGB();break;
           case 0x40: MUSIC();break;    
         }   
         recSize = 0;
         return 0;
       }
    }
    
    

    3. CRC校验算法

    在此次通信实现过程中,我们的CRC校验采用了查表法实现,具体实现过程需要先定义CRC 高位字节值表和CRC 低位字节值表,然后调用事先写好的校验算法函数查表获得消息对应的CRC高低位值,具体内容如下。

    1.CRC 高位字节值表

    // CRC 高位字节值表
    const byte chCRCHTalbe[] =
    {
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
      0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
      0x00, 0xC1, 0x81, 0x40
    };
    

    2.CRC 低位字节值表

    // CRC 低位字节值表
    const byte chCRCLTalbe[] =
    {
      0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
      0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
      0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,
      0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
      0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
      0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
      0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,
      0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
      0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,
      0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
      0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
      0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
      0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,
      0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
      0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
      0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
      0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,
      0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
      0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,
      0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
      0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
      0x41, 0x81, 0x80, 0x40
    };
    

    3.CRC 校验函数模块

    //CRC校验算法
     unsigned short calculateCRC(byte* pchMsg, unsigned short DataLen)
    {
      byte chCRCHi = 0xFF; // 高CRC字节初始化
      byte chCRCLo = 0xFF; // 低CRC字节初始化
      unsigned short Index;         // CRC循环中的索引
      while (DataLen--)
      {
        // 计算CRC
        Index = chCRCLo ^ *pchMsg++ ;
        chCRCLo = chCRCHi ^ chCRCHTalbe[Index];
        chCRCHi = chCRCLTalbe[Index] ;
      }
      return ((chCRCHi << 8) | chCRCLo) ;//CRC校验算法
    }
    

    4. 总结

    本次基于Modbus通信协议的通信过程,我们使用到了Arduino mega 2560,Arduino Uno,多功能扩展板Easy MIX V1以及LCM12864液晶显示屏,最终实现了基于Modbus协议的四种数据功能的传输,双向通信过程中,主从板所调用的帧发送和接收函数基本一致。在此过程中LCM12864的显示功能使用到了U8glib库文件,在Uno板与计算机通信的同时又与mega板通信,由于其硬串口的不足,需要我们自己进行软串口的定义,在主板程序中还涉及屏幕上二级菜单的设计,具体完整代码及所需库文件就不在此处进行详细展示,如各位需要,欢迎随时私信联系,期待和大家的共同探讨与学习。

    展开全文
  • Arduino Mega2560简介

    千次阅读 2018-12-01 18:30:32
    Arduino Mega2560是采用USB接口的核心电路板,具有54路数字输入输出,适合需要大量IO接口的设计。处理器核心是ATmega2560, 同时具有54路数字输入/输出口(其中15路可作为PWM输出),15路模拟输...
  • arduino mega 2560 针脚说明

    万次阅读 2016-02-24 09:57:41
    Arduino Mega2560也是采用USB接口的核心电路板,它最大的特点就是具有多达54路数字输入输出,特别适合需要大量IO接口的设计。Mega2560的处理器核心是ATmega2560,同时具有54路数字输入/输出口(其中16路可作为PWM...
  • 关于Arduino Mega2560的最基本介绍

    万次阅读 2017-11-16 19:55:32
    Arduino Mega 2560是基于ATmega2560的主控开发板。Arduino Mega2560是采用USB接口的核心电路板。具有54路数字输入输出,适合需要大量IO接口的设计。处理器核心是ATmega2560,同时具有54路数字输入/输出口,16路模拟...
  • Arduino mega 2560 通过I2C驱动LCD1602

    千次阅读 2020-07-28 11:02:37
    之前有幸拿到社区发来的Arduino Mega 2560 和扩展板,一直再酝酿写点儿什么,每次都很踟蹰,不知道写个什么应用好,又要让小白能够容易理解,又不会和其他的人冲突,还要有很好的创意,看着手中的板子,我有点儿迷茫...
  • 使用Arduino UNO和HC05进行通信的时候,会用到一个语句 SoftwareSerial BT(10, 11); 这是定义一个SoftwareSerial对象:BT,并初始化了RX和TX的引脚,这之后才能通过BT对象对蓝牙进行操作。 但当与HC05通信时的单片机...
  • 该项目包含代码,用于处理主机端串行通信和音频编码,以及生成包含要存储在atmega2560的PROGMEM中的音频的C ++头文件。 每个播放模式( STREAM_PCM , STREAM_DFPWM , STORED_PCM , STORED_DFPWM )都有一个主机...
  • 前言 写本文有三个原因。一来最近做毕业设计,做个记录,也补之前没写...ROSArduinoBridge 串口协议 第一次看ROSArduinoBridge这个包的时候,我的头是懵的。可能是当初太小白了,基础不行,网上的资料也没有现在...
  • arduino mega2560与HC-06蓝牙模块使用

    万次阅读 2015-02-11 20:06:19
    选择了Arduino Mega2560作为控制器; HC06蓝牙模块作为无线通讯模块,用来和Android蓝牙模块通讯(该模块不支持蓝牙4.0); 该文主要完成了Arduino对蓝牙模块的设置,通过Arduino对信号进行捕捉,并通过蓝牙模块发送...
  • 我自己的项目的一个部分控制代码,红外激光传感器的通讯协议是通过串口进行的,控制代码相对简单,测距精度较高,根据传感器的选型得到精度值。值得参考
  • nRF24L01通信 1. nRF24L01通信简介 (1)nRF24L01通信经历  先说说小菜鸟蛋疼调试模块的经历吧~有可能某些人觉得没有必要写这篇文章,因为Arduino作为开源硬件,本身容易上手例程也很多,直接跑就可以判断是软件...
  • mega 2560连接pi3b进行串口通信,发现没有ttyACM1只有ttyUSB0。 而且arduino ide 里tools菜单里面的serial port是灰色无法点击,上传程序报错找不到com1口。 不知道到底哪里出了问题。
  • google发布的ADK板(下称A板)是参考Arduino MEGA2560板(下称M板)进行设计的,让我们来看看有哪些不一样的地方   ADK Arduino MEGE2560 电源 LT3480EDD#PBF LP...
  • Arduino Mega2560和Teensy3.1开发板知识

    千次阅读 2017-12-15 14:18:34
    今年七月份终于成为一名研二的学生,开启了人生中的项目之旅,之前几年一直浑浑噩噩度过,啥也不会干。半年下来,本项目完成的差不多了,也算证明小白其实只要肯... 做的是一个窄带通信系统,基本环境、功能师兄们在我
  • 1.mega2560的板子有4组tx rx Serial.begin(19200); //串口0,就是PWM区域里的Pin0和Pin1脚 Serial1.begin(19200); //串口1,即Pin19及Pin18 Serial2.begin(19200); //串口2,即Pin17及Pin16 Serial3.begin(19200); /...
  • Arduino MEGA2560接LCD1602A i2c接口

    千次阅读 2020-02-19 21:03:21
    GND接GND VCC接5V SDV接20 SCl接21

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 577
精华内容 230
关键字:

arduinomega2560串口通信