arduino与上位机VB串口通信
基于Visual Basic的串口通讯和Arduino的智能小车控制系统设计

基于Visual Basic的串口通讯和Arduino的智能小车控制系统设计作者:王飞杨娟娟来源:《科技与创新》2016年第01期摘要:针对智能小车中存在的问题提出相关改进措施,并介绍了一种新的控制系统。
该系统是将Arduino作为主控单元,利用Visual Basic开发的上位机软件进行控制,从而进一步提高了智能小车人机交互的功能性。
关键词:Visual Basic;智能小车;Arduino;上位机软件中图分类号:TP23 文献标识码:A DOI:10.15913/ki.kjycx.2016.01.073智能化是当今世界发展的方向之一,有大批科研人员投身这项工作中。
智能化的主控核心在于其控制系统,它的水平决定了智能化的水平。
此次设计的智能小车使用两后轮驱动,前轮安装一个导向轮,同时,还为小车安装了超声波测距传感器。
此传感器可以让小车在行进的过程中成功避开障碍物,并按指令行驶,这是智能小车的关键部分。
它虽然是智能的,但可控性比较差,并不能完全按照人的想法动作。
至此,引入上位机软件直接控制智能小车具有操作性强、易于控制的特点。
1 Visual Basic串口通讯简介利用VB实现串口通信的方法有2种,一种是利用其自身集成的MSComm通讯控件实现与外接设备的通信,另一种是利用通信API函数实现串口通信。
MSComm通讯控件通过串行端口传输和接收数据,并为应用程序提供串行通信功能。
PC 机通过此控件利用串行口与其他设备连接,从而实现两设备的数据通信。
MSComm通讯控件的主要属性和方法:Setting:设置并返回通讯参数。
PortOpen:通过设置其值打开或关闭串口。
Input:返回并删除接收缓冲区的数据流。
Output:向传输缓冲区写数据流。
根据程序的功能及其用途,在使用过程中,用OnComm事件和CommEvent属性监视并检测通信事件和错误值。
ComEvSend:发送缓冲区的字符数比Sthreshold。
两个arduino串口通信例子

两个arduino串口通信例子在Arduino编程中,串口通信被广泛应用于传输数据。
本例演示如何使用两个Arduino板实现串口通信。
硬件需求:- 两个Arduino板(这里我们使用Arduino Uno)- USB电缆- 两个面包板- 两个LED- 杜邦线步骤:1. 连接一个Arduino板,并上传以下代码:```void setup() {Serial.begin(9600);}void loop() {Serial.println('Hello from Arduino 1!');delay(1000);}```这个程序每秒钟发送一条包含“Hello from Arduino 1!”的消息到串口。
2. 连接另一个Arduino板,并上传以下代码:```void setup() {Serial.begin(9600);pinMode(LED_BUILTIN, OUTPUT);}void loop() {if (Serial.available() > 0) {String message = Serial.readStringUntil('');if (message == 'Hello from Arduino 1!') {digitalWrite(LED_BUILTIN, HIGH);delay(1000);digitalWrite(LED_BUILTIN, LOW);}}}```这个程序等待从串口接收到来自另一个Arduino板的消息。
如果消息是“Hello from Arduino 1!”则点亮板上的LED一秒钟。
3. 使用USB电缆将两个Arduino板连接在一起。
将一个板连接到计算机,打开串口监视器。
在另一个板上按下复位按钮。
您应该能够看到串口监视器中发送和接收的消息。
2. 实现Arduino与Python之间的串口通信Python是一种广泛使用的编程语言,用于各种计算机应用程序。
arduino与上位机VB串口通信教学文案

用pc控制LED灯注意红色的LED灯,熄灭的亮了,程序界面,注意要开启串口才能控制注意,我的arduino板子占用com3,所以mscomm也要用3口,不要弄错了,这里走过弯路,隔天才发现的,(彩色小点PS加上的,方便理解)。
下面是源码,方便复制:--------------------------------------------------------'vb写的上位机程序Private Sub Command1_Click()Comm3.PortOpen = TrueEnd SubPrivate Sub Command2_Click()Comm3.PortOpen = FalseEnd SubPrivate Sub Command3_Click()Comm3.Output = "a" '用a表示开灯End SubPrivate Sub Command4_Click()Comm3.Output = "b" '用b表示灭灯End Sub-----------------------------------------//arduino程序//通过电脑开关LED灯(LED灯负极连在arduino uno r3板数字3口,正极串一个1K 电阻后连板子5V电源正极//int led1=3; //把LED连在Arduino数字端口3//初始化void setup(){Serial.begin(9600); //启动串行通讯,波特率为9600b/s pinMode(led1,OUTPUT);digitalWrite(led1,HIGH); //熄灭LED灯}//主程序void loop(){char val;//定义变量val,用于暂存上位机发送来的字符if(Serial.available()>0)//如果上位机发送来了字符{val=Serial.read(); //读取上位机发来的字符,并保存到valSerial.println(val); //显示接受到的字符if(val=='a')//如果上位机发送字符'a',{digitalWrite(led1,LOW); //点亮LED灯}if(val=='b')//如果上位机发送字符'b',{digitalWrite(led1,HIGH);//熄灭LED1}}delay(100);//延时100ms}。
VB上位机串口通讯

'初始化代码Private Sub Form_Load() '窗体被加载时产生If MSComm1.PortOpen = True Then '串口查看是否打开,打开则关闭MsgBox "端口已经打开", 2'MSComm1.PortOpen = FalseEnd IfWith MSComm1.CommPort = 3 '设置串口3.Settings = "9600,n,8,1".InputLen = 0 '读取接收缓冲区所有字符.InBufferSize = 1024 '设置接收缓冲区1024字节.OutBufferSize = 512 '设置发送缓冲区512字节.InputMode = comInputModeText. '采用文本传输'.PortOpen = True '打开串口.SThreshold = 0 '一发送数据就触发OnComm事件.RThreshold = 1 '接收到一个字节就触发OnComm事件.InBufferCount = 0 '清除发送缓冲区数据.OutBufferCount = 0 '清除接收缓冲区数据End WithText_send.Text = ""Text_recv.Text = ""Text_send_16.Text = ""End Sub'清空对话框数据Sub Command3_Click(Index As Integer)Text_send.Text = ""Text_recv.Text = ""Text_send_16.Text = ""End Sub'通讯端口选择Private Sub Combo1_Click()If Combo1.Text = "com1" Then '通讯端口号设置mPort = 1'Text1 = 1ElseIf Combo1.Text = "com2" ThenmPort = 2'Text1 = 2ElseIf Combo1.Text = "com3" ThenmPort = 3'Text1 = 3ElseIf Combo1.Text = "com4" ThenmPort = 4'Text1 = 4ElsemPort = 5'Text1 = 5End IfEnd SubPrivate Sub Combo2_Click()If Combo2.Text = "9600,e,8,1" ThenMSComm1.Settings = "9600,e,8,1"ElseIf Combo2.Text = "9600,n,8,1" ThenMSComm1.Settings = "9600,n,8,1"ElseIf Combo2.Text = "57600,n,8,1" ThenMSComm1.Settings = "57600,n,8,1"End IfEnd Sub'发送数据Private Sub Command1_Click(Index As Integer)'判断是否选择了端口与通讯方式If CBool(Combo1.Text = "请选择") Or CBool(Combo2.Text = "请选择") = 1 Then MsgBox "请设置端口号与通讯方式", 2Exit SubEnd If'保证串口打开If Not MSComm1.PortOpen ThenMSComm1.PortOpen = TrueEnd If'发送数据MSComm1.Output = Text_send.Text'延时For i = 1 To 2000000Next iEnd Sub'发送16进制数据Private Sub Command4_Click(Index As Integer)'判断是否选择了端口与通讯方式If CBool(Combo1.Text = "请选择") Or CBool(Combo2.Text = "请选择") = 1 Then MsgBox "请设置端口号与通讯方式", 2Exit SubEnd If'保证串口打开If Not MSComm1.PortOpen ThenMSComm1.PortOpen = TrueEnd If'发送数据Dim a, b As String'Dim a As Long, b As Stringa = Text_send_16.Textb = CLng("&H" & a)MSComm1.Output = b'延时For i = 1 To 2000000Next iEnd SubPrivate Sub Command2_Click(Index As Integer)'判断是否选择了端口与通讯方式If CBool(Combo1.Text = "请选择") Or CBool(Combo2.Text = "请选择") = 1 Then MsgBox "请设置端口号与通讯方式", 2Exit SubEnd If'保证串口打开If Not MSComm1.PortOpen ThenMSComm1.PortOpen = TrueEnd If'接受数据Dim str As Stringstr = MSComm1.Input '从接收队列中读入字符串Text_recv.Text = Text_recv.Text & str '读出字符串送显Text_recv.Text = Text_recv.Text & "" & vbCrLf '文本换行符End Sub。
串口通讯及其在VB平台下的实现

串口通讯及其在VB平台下的实现摘要:本文首先介绍串行通讯的基础知识,然后结合示例剖析在VB平台下的串口通讯的编程技巧。
随着计算机系统的普及与外围设备技术的发展,计算机与外围设备之间的通讯就显得越来越重要了。
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。
对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。
在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。
所以串行接口是微机应用系统常用的接口,而相应的应用程序也成为今年来研究的热点。
本文旨在阐述一般的穿口通讯的原理及其程序设计,希望借此能够抛砖引玉,为更深入的研究打下一定的基础。
一、串行通讯的基本原理所谓"串行通信"是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。
相比之下,由于高速率的要求,处于计算机内部的CPU与串口之间的通讯仍然采用并行的通讯方式,所以串行口的本质就是实现CPU与外围数据设备的数据格式转换(或者称为串并转换器),即当数据从外围设备输入计算机时,数据格式由位(bit)转化为字节数据;反之,当计算机发送下行数据到外围设备时,串口又将字节数据转化为位数据。
二、串口通讯的程序设计原理前面介绍了串行通讯的基本原理,那么如何在程序设计中实现它呢?事实上,这个过程并不复杂,一般有两种实现途径:其一就是使用MSCOMM控件,此控件提供很多方便操作的属性和方法,利用它们可以很方便地实现你的目的;另外一种途径就是使用Windows API,微软为开发者提供了很多相关的串行操作的编程接口,使用这些接口,可以很完成更为强大的功能。
VB下实现串口通信的方法

VB下实现串口通信的方法1 VB下实现串口通信的方法1.1 通信控件MSComm简介VB下的串行端口通信是通过其提供的控件Microsoft Comm control(简称MSComm)实现的。
该控件屏蔽了通信过程中的底层操作,程序员只需设置并监视MSComm控件的属性和事件,结合其它VB提供的控件就可完成对串口的初始化和数据的发送接收。
本系统中用到的主要MSComm控件属性如下:①、Commport:设置并返回通信端口代码。
默认值为1,最大值为16,需要使用超过16个通信端口时,要采用其他方式操控通信端口(如PcommPro软件)。
例如将串口2设为通信端口:mPort=2。
②、Setting:设置初始化参数。
其格式为“****,P,D,S”,其中****为波特率(baud),P为校验方式,D为数据位数,S为停止位。
默认值为“9600,N,8,1”,意为“串口通信速度为9600Baud,无校验,每次数据为8个Bit,停止位为1个Bit”。
波特率可为110,300,600,1200,2400,9600,14400,19200,28800,38400(保留)等等。
校验位默认为None(无校验),若传输距离长,可增加校验位,可选M为符号校验,E为偶校验,O为奇校验,S为空白校验。
停止位的设定值可为:1(默认值),1.5,2。
此处的设置要和单片机侧的设置保持一致,否则不能实现正常的通信。
例如我们采用的初始化参数为“2400,N,8,1”,则单片机侧的设置相应项为:定时器1的初值为E6并且SMOD(串行口波特率加倍位)为1(对应2400Bit),串口控制寄存器SCON为40(10位异步收发,对应8Bit数据位,1Bit停止位)。
③、PortOpen:设置或返回通信端口状态。
④、Input:从缓冲区返回并删除字符。
将串行输入寄存器的数据读出,并清除寄存器中已读取的数据。
寄存器的特性是FIFO(First In First Out,先进先出)。
arduino与上位机通信教程

a r d u i n o与上位机通信教程公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-1,接收函数S e r i a l.r e a d() int Serial.read(void)如果串行数据缓冲区有数据,这个函数会读取串行数据缓冲区的第一个字节,数据读取位置移动到下一个数据缓冲区,也就是说如果继续读取的话会读取下一个数据缓冲区的第一个字节.如果数据缓冲区没有数据,将返回-1.2,发送函数Serial.printSerial.print(val)Serial.print(val, format)Serial.print(val)首先注意: print是一个打印函数,主要用于在上位机上显示,让数据可视化,它会将数据用字符的形式(ASCII码)逐个发送到串口. 一般不用这个函数来进行数据传输.比如下面这段代码不会在串口助手上显示3个256,而会分别显示'2','5','6'的ASCII码值,50,53,54(分三次发送,有三个地址不同的数据缓冲区)void setup() {// initialize serial ports:Serial.begin(9600);Serial1.begin(9600);Serial3.begin(9600);Serial3.print(256);if (Serial1.available()>0) {Serial.println(Serial1.read());Serial.println(Serial1.read());Serial.println(Serial1.read());}}void loop() {}既然print是一个打印函数,那么自然,参数val的类型是任意的. Serial.print(val, format)将val的值转换成format指定的形式发送,可为BIN,OCT,HEX,DEC.3,发送函数Serial.writeSerial.write(str)str为字符串的首地址,buf为一个用来存放数据的数组的首地址. 这个函数会先发送字符串,然后返回字符串的长度.void setup(){Serial.begin(9600);}void loop(){Serial.write(45); // send a byte with the value 45int bytesSent = Serial.write("hello");Serial.println(bytesSent);}Serial.write(val)val的数据类型为unsigned char,这个函数每次只发送一个字节的数据,所以val的值在0-255之间.Serial.write(buf, len)buf为要发送的数组的首地址(注意数组的类型为unsigned char),len为数组的长度.void setup(){Serial.begin(9600);Serial3.begin(9600);Serial1.begin(9600);}void loop(){unsigned char data[2] ={11,0};Serial3.write(data,2);if(Serial1.available()>0)Serial.println(Serial1.read());Serial.println(Serial1.read());}回到开头的问题,如何从一个单片机的串口发送数据到Arduino上,然后用Arduino显示呢我们可以先用单片机的print函数把数据打印到串口,然后用Serial1.readBytes(Serial的加强版,具体看官方参考手册)把数据从串口读取回来(以ASCII码的形式),然后把ASCII码转换成字符,然后发送. unsigned int send_data =1234;char rx_data[4];void setup(){Serial.begin(9600);Serial3.begin(9600);Serial1.begin(9600);}void loop(){Serial3.print( send_data);if(Serial1.available()>0){Serial1.readBytes(rx_data,4);for(char i=0;i<4;i++){Serial.print(char(rx_data));}Serial.print("\n");}delay(500);}注意:本文的串口使用的都是板上的串口,当和非Arduino板通信的时候注意使用TTL转RS232电平转接板.(所有的代码已验证)。
VB中串口通讯的实现详解说明

VB中串口通讯的实现详解说明在VB中实现串口通讯可以分为以下几个步骤:1.引用串口通讯相关的命名空间首先在项目中引用System.IO.Ports命名空间,该命名空间包含了实现串口通讯所需的类和方法。
2.创建串口对象使用SerialPort类创建一个串口实例,可以指定串口的名称、波特率、数据位、停止位、校验位等参数。
```vbDim serialPort As New SerialPortserialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.DataBits = 8serialPort.StopBits = StopBits.OneserialPort.Parity = Parity.None```3.打开串口使用Open方法打开串口,可以在Open之前先判断串口是否已经打开。
```vbIf serialPort.IsOpen Then'串口已经打开ElseserialPort.OpenEnd If```4.串口数据接收通过事件处理函数来处理串口接收到的数据。
可以使用DataReceived事件来处理数据接收,当串口接收到数据时会触发该事件。
```vbPrivate Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles serialPort.DataReceived Dim data As String = serialPort.ReadExisting'处理接收到的数据End Sub```5.串口数据发送通过串口的Write方法来发送数据。
```vbserialPort.Write("Hello World")```需要注意的是,串口通讯是一种异步操作,发送和接收数据都需要一定的时间,因此在程序中需要合理处理串口的状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用pc控制LED灯
注意红色的LED灯,熄灭的
亮了,程序界面,注意要开启串口才能控制
注意,我的arduino板子占用com3,所以mscomm也要用3口,不要弄错了,这里走过弯路,隔天才发现的,(彩色小点PS加上的,方便
理解)。
下面是源码,方便复制:
--------------------------------------------------------
'vb写的上位机程序
Private Sub Command1_Click()
Comm3.PortOpen = True
End Sub
Private Sub Command2_Click()
Comm3.PortOpen = False
End Sub
Private Sub Command3_Click()
Comm3.Output = "a" '用a表示开灯
End Sub
Private Sub Command4_Click()
Comm3.Output = "b" '用b表示灭灯
End Sub
-----------------------------------------
//arduino程序
//通过电脑开关LED灯(LED灯负极连在arduino uno r3板数字3口,正极串一个1K 电阻后连板子5V电源正极
//
int led1=3; //把LED连在Arduino数字端口3
//初始化
void setup()
{
Serial.begin(9600); //启动串行通讯,波特率为9600b/s pinMode(led1,OUTPUT);
digitalWrite(led1,HIGH); //熄灭LED灯
}
//主程序
void loop()
{
char val;//定义变量val,用于暂存上位机发送来的字符
if(Serial.available()>0)//如果上位机发送来了字符
{
val=Serial.read(); //读取上位机发来的字符,并保存到val Serial.println(val); //显示接受到的字符
if(val=='a')//如果上位机发送字符'a',
{
digitalWrite(led1,LOW); //点亮LED灯}
if(val=='b')//如果上位机发送字符'b',
{
digitalWrite(led1,HIGH);//熄灭LED1 }
}
delay(100);//延时100ms
}。