极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14540|回复: 13

Arduino与LabVIEW串口控制LED亮灭

[复制链接]
发表于 2013-5-10 11:59:30 | 显示全部楼层 |阅读模式
本帖最后由 nust_奔跑 于 2013-5-10 11:58 编辑

本文使用proteus仿真环境,实现Arduino UNO与LabVIEW的串口通讯,LabVIEW通过RS-232串口控制Arduino UNO的LED灯,打开和关闭LED灯。

1、Arduino UNO部分
    在protues仿真仿真环境中,使用ATmega328P单片机实现基于Protues的Arduino UNO的开发板,如下图1所示。


1.jpg
图1 基于Protues的Arduino UNO的开发板

    此处,还需要对ATmega328P的参数进行设置,初始的设置如图2所示。需要更改的地方已在图中用红色框标注出来了。更改之后的设置如图3所示,其中HEX文件与你自己所存放的地方一致即可。


2.jpg
图2 ATmega328P单片机更改前的设置

3.jpg
图3 ATmega328P单片机更改后的设置


    另外,要实现与LabVIEW的串口通讯还需要对串口的参数进行设置,串口更改前的设置如图4所示。需要更改的地方已在图中用红色框标注出来了。更改之后的设置如图5所示,其中波特率与上位机的波特率相同即可。
   注意:波特率一定要相同,否则不能完成通讯。

4.jpg
图4 串口更改前的设初始置

5.jpg
图5 串口更改后的设置


    Arduino的源代码如下所示:

  1. #define LED_ON_COMMAND  0x10   //打开LED命令字
  2. #define LED_OFF_COMMAND 0x20   //关闭LED命令字
  3. byte comdata[3]={0};      //定义数组数据,存放串口命令数据
  4. int LED = 13;                 //定义LED连接的管脚
  5. int ON_mark=0;                //定义ON 的标志位
  6. int OFF_mark=0;               //定义OFF的标志位
  7. void receive_data(void);      //接受串口数据
  8. void test_data(void);         //测试串口数据是否正确,并更新数据
  9. void do_command(void);        //执行更新的数据
  10. void setup()
  11. {
  12.   Serial.begin(9600);      
  13.   pinMode(LED, OUTPUT);
  14.   
  15. }

  16. void loop()
  17. {
  18.   while (Serial.available() > 0)   //不断检测串口是否有数据
  19.    {
  20.         receive_data();            //接受串口数据
  21.         test_data();               //测试数据是否正确并更新数据
  22.         do_command();              //执行更新的数据
  23.    }
  24. }

  25. void receive_data(void)      
  26. {
  27.    int i ;
  28.    for(i=0;i<3;i++)
  29.    {
  30.       comdata[i] =Serial.read();
  31.       //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失,
  32.        delay(2);
  33.    }
  34. }
  35. void test_data(void)
  36. {
  37.   if(comdata[0] == 0x55)            //0x55和0xAA均为判断是否为有效命令
  38.    {
  39.      if(comdata[1] == 0xAA)
  40.      {
  41.         if(comdata[2] == LED_ON_COMMAND)
  42.           {   
  43.               ON_mark=2;                //ON数据更新位置位
  44.               
  45.           }
  46.         if(comdata[2] == LED_OFF_COMMAND)
  47.           {
  48.               OFF_mark=2;               //OFF数据更新位置位
  49.               
  50.           }
  51.       }
  52.    }
  53. }
  54. void do_command(void)
  55. {
  56.   if(OFF_mark==2)
  57.   {
  58.     OFF_mark=0;                         //复位OFF更新位
  59.     digitalWrite(LED, LOW);             //关闭LED灯
  60.    
  61.   }
  62.   if(ON_mark==2)
  63.   {
  64.      ON_mark=0;                        //复位ON 更新位
  65.      digitalWrite(LED, HIGH);           //打开LED灯
  66.      
  67.   }
  68. }
复制代码



2、LabVIEW部分
    LabVIEW上位机部分担任主机,Arduino UNO作为下位机接收上位机发送的命令,并执行命令。LabVIEW只需要完成命令的发送,此处仅使用了LabVIEW的串口数据发送功能。LabVIEW的串口设置见。
    LabVIEW程序包括两个部分:前面板和程序框图,前面板如图6所示,程序框图如图7、8、9所示。



6.jpg
图6 LabVIEW前面板

7.jpg
图7 LabVIEW程序框图1

8.jpg
图8 LabVIEW程序框图2
9.jpg
图9 LabVIEW程序框图3

3、结束语
    利用虚拟串口技术,实现了Protues仿真环境下的Arduino UNO与LabVIEW串口通讯,并自定义了通讯协议,以保证通讯的可靠性。
回复

使用道具 举报

 楼主| 发表于 2013-5-10 12:01:47 | 显示全部楼层
本帖最后由 nust_奔跑 于 2013-5-10 12:03 编辑

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-10 12:06:36 | 显示全部楼层
抛出现在存在的问题:
1、把程序下载到arduino  2560和UNO里面,通过串口助手可以控制LED亮灭,但是通过LabVIEW却不能控制。
2、把程序下载到MSP430 launchpad里面,可以通过串口助手和LabVIEW控制LED亮灭。
3、protues仿真也可以通过串口助手和LabVIEW控制LED。
求解答~~~
回复 支持 反对

使用道具 举报

发表于 2013-5-11 12:15:18 | 显示全部楼层
话说仿真能用arduino的代码????
回复 支持 反对

使用道具 举报

发表于 2013-5-11 12:15:35 | 显示全部楼层
不了解仿真这一块儿……所以很好奇……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-11 12:40:51 | 显示全部楼层
friskit 发表于 2013-5-11 12:15
话说仿真能用arduino的代码????

可以~~~
你可以看看我的视频~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-11 12:41:25 | 显示全部楼层
friskit 发表于 2013-5-11 12:15
不了解仿真这一块儿……所以很好奇……

把IDE生成的HEX导入到单片机里面就可以~~~
回复 支持 反对

使用道具 举报

发表于 2013-5-11 16:48:49 | 显示全部楼层
nust_奔跑 发表于 2013-5-11 12:41
把IDE生成的HEX导入到单片机里面就可以~~~

实际上是ide里头根据这个单片机的指令集,把c++代码编译成机器码了???好强大的样纸!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-11 16:58:46 | 显示全部楼层
friskit 发表于 2013-5-11 16:48
实际上是ide里头根据这个单片机的指令集,把c++代码编译成机器码了???好强大的样纸!!

是这样的~~
arduino的IDE很强大~~
arduino的板子只是里面加了bootloader,引导程序下载。
其他的和一般的单片机一样~
回复 支持 反对

使用道具 举报

发表于 2013-6-11 16:39:05 | 显示全部楼层
你把Labview中的关闭串口的控件给删除,不要关闭串口。好像就可以了,我想这样是因为arduino中没有串口中断,只是感觉,也不清楚是怎么回事。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-11 17:20:11 | 显示全部楼层
天空树 发表于 2013-6-11 16:39
你把Labview中的关闭串口的控件给删除,不要关闭串口。好像就可以了,我想这样是因为arduino中没有串口中断 ...

就是LabVIEW里面不要关闭串口,就可以了?
谢谢~我试试看~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-11 19:26:18 | 显示全部楼层
天空树 发表于 2013-6-11 16:39
你把Labview中的关闭串口的控件给删除,不要关闭串口。好像就可以了,我想这样是因为arduino中没有串口中断 ...

果然如此,万分感谢!
回复 支持 反对

使用道具 举报

发表于 2014-8-12 14:30:12 | 显示全部楼层
55 AA 20 的蓝色框框怎么弄出来的,为啥创建数据直接创建的输入是橙色的,好像橙色的不对!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-11-18 12:58 , Processed in 0.063911 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表