Arduino与LabVIEW串口控制LED亮灭
本帖最后由 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 基于Protues的Arduino UNO的开发板
此处,还需要对ATmega328P的参数进行设置,初始的设置如图2所示。需要更改的地方已在图中用红色框标注出来了。更改之后的设置如图3所示,其中HEX文件与你自己所存放的地方一致即可。
图2 ATmega328P单片机更改前的设置
图3 ATmega328P单片机更改后的设置
另外,要实现与LabVIEW的串口通讯还需要对串口的参数进行设置,串口更改前的设置如图4所示。需要更改的地方已在图中用红色框标注出来了。更改之后的设置如图5所示,其中波特率与上位机的波特率相同即可。
注意:波特率一定要相同,否则不能完成通讯。
图4 串口更改前的设初始置
图5 串口更改后的设置
Arduino的源代码如下所示:
#define LED_ON_COMMAND0x10 //打开LED命令字
#define LED_OFF_COMMAND 0x20 //关闭LED命令字
byte comdata={0}; //定义数组数据,存放串口命令数据
int LED = 13; //定义LED连接的管脚
int ON_mark=0; //定义ON 的标志位
int OFF_mark=0; //定义OFF的标志位
void receive_data(void); //接受串口数据
void test_data(void); //测试串口数据是否正确,并更新数据
void do_command(void); //执行更新的数据
void setup()
{
Serial.begin(9600);
pinMode(LED, OUTPUT);
}
void loop()
{
while (Serial.available() > 0) //不断检测串口是否有数据
{
receive_data(); //接受串口数据
test_data(); //测试数据是否正确并更新数据
do_command(); //执行更新的数据
}
}
void receive_data(void)
{
int i ;
for(i=0;i<3;i++)
{
comdata =Serial.read();
//延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失,
delay(2);
}
}
void test_data(void)
{
if(comdata == 0x55) //0x55和0xAA均为判断是否为有效命令
{
if(comdata == 0xAA)
{
if(comdata == LED_ON_COMMAND)
{
ON_mark=2; //ON数据更新位置位
}
if(comdata == LED_OFF_COMMAND)
{
OFF_mark=2; //OFF数据更新位置位
}
}
}
}
void do_command(void)
{
if(OFF_mark==2)
{
OFF_mark=0; //复位OFF更新位
digitalWrite(LED, LOW); //关闭LED灯
}
if(ON_mark==2)
{
ON_mark=0; //复位ON 更新位
digitalWrite(LED, HIGH); //打开LED灯
}
}
2、LabVIEW部分
LabVIEW上位机部分担任主机,Arduino UNO作为下位机接收上位机发送的命令,并执行命令。LabVIEW只需要完成命令的发送,此处仅使用了LabVIEW的串口数据发送功能。LabVIEW的串口设置见。
LabVIEW程序包括两个部分:前面板和程序框图,前面板如图6所示,程序框图如图7、8、9所示。
图6 LabVIEW前面板
图7 LabVIEW程序框图1
图8 LabVIEW程序框图2
图9 LabVIEW程序框图3
3、结束语
利用虚拟串口技术,实现了Protues仿真环境下的Arduino UNO与LabVIEW串口通讯,并自定义了通讯协议,以保证通讯的可靠性。 本帖最后由 nust_奔跑 于 2013-5-10 12:03 编辑
http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=103540808_1647970383/s.swf 抛出现在存在的问题:
1、把程序下载到arduino2560和UNO里面,通过串口助手可以控制LED亮灭,但是通过LabVIEW却不能控制。
2、把程序下载到MSP430 launchpad里面,可以通过串口助手和LabVIEW控制LED亮灭。
3、protues仿真也可以通过串口助手和LabVIEW控制LED。
求解答~~~ 话说仿真能用arduino的代码???? 不了解仿真这一块儿……所以很好奇…… friskit 发表于 2013-5-11 12:15 static/image/common/back.gif
话说仿真能用arduino的代码????
可以~~~
你可以看看我的视频~ friskit 发表于 2013-5-11 12:15 static/image/common/back.gif
不了解仿真这一块儿……所以很好奇……
把IDE生成的HEX导入到单片机里面就可以~~~ nust_奔跑 发表于 2013-5-11 12:41 static/image/common/back.gif
把IDE生成的HEX导入到单片机里面就可以~~~
实际上是ide里头根据这个单片机的指令集,把c++代码编译成机器码了???好强大的样纸!! friskit 发表于 2013-5-11 16:48 static/image/common/back.gif
实际上是ide里头根据这个单片机的指令集,把c++代码编译成机器码了???好强大的样纸!!
是这样的~~
arduino的IDE很强大~~
arduino的板子只是里面加了bootloader,引导程序下载。
其他的和一般的单片机一样~ 你把Labview中的关闭串口的控件给删除,不要关闭串口。好像就可以了,我想这样是因为arduino中没有串口中断,只是感觉,也不清楚是怎么回事。 天空树 发表于 2013-6-11 16:39 static/image/common/back.gif
你把Labview中的关闭串口的控件给删除,不要关闭串口。好像就可以了,我想这样是因为arduino中没有串口中断 ...
就是LabVIEW里面不要关闭串口,就可以了?
谢谢~我试试看~ 天空树 发表于 2013-6-11 16:39 static/image/common/back.gif
你把Labview中的关闭串口的控件给删除,不要关闭串口。好像就可以了,我想这样是因为arduino中没有串口中断 ...
果然如此,万分感谢! 55 AA 20 的蓝色框框怎么弄出来的,为啥创建数据直接创建的输入是橙色的,好像橙色的不对!
页:
[1]