Arduino串口数据采集软件求助

【arduino】求助!!!请问怎么把arduino的串口数据_arduino吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:56,302贴子:
【arduino】求助!!!请问怎么把arduino的串口数据收藏
怎么把arduino的串口数据保存在数据库???
变成在数组
用上位机,串口读,然后存到数据库
恩智浦FTF未来科技峰会,通过技术创新为世界带来改变!
每个字段前面加关键字,然后导入excel
这个需要编程上位机的,有需要可以找我
登录百度帐号[原创]Arduino串口通信
Arduino串口通信
本来是要讲《Arduino与计算机》的,但是后来一想内容太多了。于是我就准备把这部分内容分成《Arduino串口通信》和《Arduino网络通信》两个部分。还有一个重要的原因是我的W5100网络模块正在路上。
在这篇,我们要讲讲Arduino串口通信实际应用相关的内容。说白了就是Arduino和电脑的相互控制,你控制我,我控制你。值得高兴的是,这一篇里不需要其他模块,又可以节约一点了。
串口通信原理等其他东西太多,我就不讲了(其实,要我讲也讲不出来。我只学会两点:在Linux下万事万物皆文件,Windows下就看API。目前,正在学习第三点:一定要约定好。说到这一点就伤心啊,不说了...),我们直接来写代码。
我的测试环境是
Win7 32位(用64位要快些)+XP系统(VM虚拟机)
VC6绿色版(比较小,压缩包只有40M左右吧,我没有用Python的原因是调试起来不方便,有时候Python的版本不一样也很麻烦)
Arduino1.6.11(软件版本)
注意:我的Arduino用的串口是COM3,如果你的串口不是的话,请自行修改代码。
代码见附件。
Arduino自带了一个串口工具,但是,你要操作计算机的话,很不方便。比如说,我在Arduino上按下按钮,运行”记事本”程序打开C:\1.txt,这就要我们自己写代码了。当然,我们会把代码写完,并测试成功。由于时间关系,我写的代码功能和UI上都不尽人意,不过作为教学的一个例来讲,还好吧。现在,就让我们来开始串口编程之行。
一、Arduino向计算机发送的数据(命令行程序)。
先来个例子看看:
首先在Arduino中,写一段简单的测试程序,不断向串口发送"Hello World!"
void setup()
&&Serial.begin(9600);//设置波特率为9600
void loop()
&&Serial.println("Hello World!");
&&delay(500);
由于我用的是Win7系统,所以用VC6写了一段接收程序。
如果大家用的是Python,编写串口程序可能要方便一点,特别是Linux下。
新建一个.CPP文件,用VC6打开,把如下代码拷入去。当然,串口不一样就要改一下串。
#include &stdio.h&
#include &windows.h&
class MyCom
& & int Open()
& && &&&hCom=CreateFile("COM3",//COM3口
& && && && &GENERIC_READ|GENERIC_WRITE, //允许读和写
& && && && &0, //独占方式
& && && && &NULL,
& && && && &OPEN_EXISTING, //打开而不是创建
& && && && &0, //同步方式
& && && && &NULL);
& && &&&if(hCom==(HANDLE)-1)
& && && && &printf("打开COM失败!\r\n");
& && && && &return 0;
& && &&&else
& && && && &printf("打开COM成功!\r\n");
& && &&&return 1;
& & void Set()
& && &&&SetupComm(hCom,); //输入缓冲区和输出缓冲区的大小都是1024
& && &&&COMMTIMEOUTS TimeO
& && &&&//设定读超时
& && &&&TimeOuts.ReadIntervalTimeout=1000;
& && &&&TimeOuts.ReadTotalTimeoutMultiplier=500;
& && &&&TimeOuts.ReadTotalTimeoutConstant=5000;
& && &&&//设定写超时
& && &&&TimeOuts.WriteTotalTimeoutMultiplier=500;
& && &&&TimeOuts.WriteTotalTimeoutConstant=2000;
& && &&&SetCommTimeouts(hCom,&TimeOuts); //设置超时
& && &&&DCB
& && &&&GetCommState(hCom,&dcb);
& && &&&dcb.BaudRate=9600; //波特率为9600
& && &&&dcb.ByteSize=8; //每个字节有8位
& && &&&dcb.Parity=NOPARITY; //无奇偶校验位
& && &&&dcb.StopBits=TWOSTOPBITS; //两个停止位
& && &&&SetCommState(hCom,&dcb);
& && &&&PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
& & int Read()
& && &&&char str[100]={0};
& && &&&DWORD wC//读取的字节数
& && &&&BOOL bReadS
& && &&&bReadStat=ReadFile(hCom,str,100,&wCount,NULL);
& && &&&if(!bReadStat)
& && && && && &printf("读串口失败!\r\n");
& && && && && &return 0;
& && &&&else
& && && && && &printf("串口内容:");
& && && && && &printf("%s\r\n",str);
& && && && && &memset(str,0,100);
& && && && && &return 1;
protected:
& & HANDLE hC&&//全局变量,串口句柄
int main()
& & com.Open();//(1) 打开串口,获取串口资源句柄
& & com.Set();//(2)串口设置
& & for (int i=0;i&10;i++)
& & & & & & com.Read();//串口读取操作
& && &&&Sleep(200);
& & getchar();
& & getchar();
& & return 0;
由于我写的比较简单,一次要读取串数据100个字节,所以出现了这种情况。
二、计算机向Arduino发送的数据(命令行程序)。
Arduino程序:
int nLED_Green=13;//绿灯
String comdata = "";//字符串
void setup()
& & Serial.begin(9600);
& & pinMode(nLED_Green,OUTPUT);//设置数字13口为输出接口
void loop()
& & while (Serial.available() & 0)&&
& && &&&comdata += char(Serial.read());
& && &&&delay(2);
& & if (comdata.length() & 0 && comdata=="on")
& && &&&Serial.println("turn on LED");
& && &&&digitalWrite(nLED_Green,HIGH);//点亮灯。
& && &&&comdata = "";
& & else if(comdata.length() & 0 && comdata=="off")
& && &&&Serial.println("turn off LED");
& && &&&digitalWrite(nLED_Green,LOW);//熄灭灯。
& && &&&comdata = "";
编写VC程序。我写的串口程序是同步方式写的,别的程序(包括Arduino)不能同时操作该串口。没有用异步方式,是因为同步方式要简单一点。还有一个更简单的方法,就是调用CSerialPort这个第三方的类,这个类用的人很多,应该不错吧。先不着急,等会写MFC程序的时候再用。
#include &stdio.h&
#include &windows.h&
class MyCom
& & MyCom()
& && &&&hCom=NULL;
& & ~MyCom()
& && &&&if (hCom!=NULL)
& && && && &CloseHandle(hCom);
& & //(1) 打开串口,获取串口资源句柄
& & int Open()
& && &&&hCom=CreateFile("COM3",//COM3口
& && && && &GENERIC_READ|GENERIC_WRITE, //允许读和写
& && && && &0, //独占方式
& && && && &NULL,
& && && && &OPEN_EXISTING, //打开而不是创建
& && && && &0, //同步方式
& && && && &NULL);
& && &&&if(hCom==(HANDLE)-1)
& && && && &printf("打开COM失败!\r\n");
& && && && &return 0;
& && &&&else
& && && && &printf("打开COM成功!\r\n");
& && &&&return 1;
& & //(2)串口设置
& & void Set()
& && &&&SetupComm(hCom,); //输入缓冲区和输出缓冲区的大小都是1024
& && &&&COMMTIMEOUTS TimeO
& && &&&//设定读超时
& && &&&TimeOuts.ReadIntervalTimeout=1000;
& && &&&TimeOuts.ReadTotalTimeoutMultiplier=500;
& && &&&TimeOuts.ReadTotalTimeoutConstant=5000;
& && &&&//设定写超时
& && &&&TimeOuts.WriteTotalTimeoutMultiplier=500;
& && &&&TimeOuts.WriteTotalTimeoutConstant=2000;
& && &&&SetCommTimeouts(hCom,&TimeOuts); //设置超时
& && &&&DCB
& && &&&GetCommState(hCom,&dcb);
& && &&&dcb.BaudRate=9600; //波特率为9600
& && &&&dcb.ByteSize=8; //每个字节有8位
& && &&&dcb.Parity=NOPARITY; //无奇偶校验位
& && &&&dcb.StopBits=TWOSTOPBITS; //两个停止位
& && &&&SetCommState(hCom,&dcb);
& && &&&PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
& & //串口读取操作
& & int Read()
& && &&&char str[100]={0};
& && &&&DWORD wC//读取的字节数
& && &&&BOOL bReadS
& && &&&bReadStat=ReadFile(hCom,str,100,&wCount,NULL);
& && &&&if(!bReadStat)
& && && && && &printf("读串口失败!\r\n");
& && && && && &return 0;
& && &&&else
& && && && && &printf("串口内容:");
& && && && && &printf("%s\r\n",str);
& && && && && &memset(str,0,100);
& && && && && &return 1;
& & int Write(char* lpOutBuffer)
& && & DWORD dwBytesWrite=strlen(lpOutBuffer)+1;
& && & COMSTAT ComS
& && & DWORD dwErrorF
& && & BOOL bWriteS
& && & ClearCommError(hCom,&dwErrorFlags,&ComStat);
& && & bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
& && & if(!bWriteStat)
& && && & //AfxMessageBox("写串口失败!");
& && && & printf("串口写入失败!\r\n");
& && && & return 0;
& && & PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
& && & return 1;
protected:
& & HANDLE hC&&//全局变量,串口句柄
int main()
& & int n = com.Open();
& & if (n==0)
& && &&&return 0;
& & com.Set();
& & char szstr[20]="off";
& & com.Write(szstr);
& & getchar();
& & return 0;
这个程序写得很简陋。使用方法是先用Arduino串口输入”on”,退出Arduino程序。运行VC编译好的程序,就可以看到LED熄灭了。
这是一个最简单的串口通信的例子了。
三、计算机向Arduino发送的数据(MFC)。
即然,能读串口,又可以写串口数据了。那么我们就可以升级一下了,把VC的控件台程序升级到MFC对话框程序。使用的是第三方的串口类。如果你需要这个类,请看我的附件。
测试了一下效果,还可以
主要代码如下:
void CContrlLEDDlg::OnOK() //开灯
& & m_SerialPort.WriteToPort("on");
& & m_edt1 = "turn on";
& & UpdateData(false);
void CContrlLEDDlg::OnOk2() //关灯
& & m_SerialPort.WriteToPort("off");
& & m_edt1 = "turn off";
& & UpdateData(false);
void CContrlLEDDlg::OnButton1() //打开串口
& && & & & if(m_SerialPort.InitPort(this,3,9600,'N',8,1,EV_RXFLAG|EV_RXCHAR,512))//3==COM3
& & & & & & & & m_SerialPort.StartMonitoring();//启动串口通信检测线程函数
& && &&&m_bPortOpen = TRUE;
& & & & else
& & & & & & & & AfxMessageBox("没有发现此串口或被占用");
& && &&&m_bPortOpen = FALSE;
& & GetDlgItem(IDOK)-&EnableWindow(m_bPortOpen);
& & GetDlgItem(IDOK2)-&EnableWindow(m_bPortOpen);
Arduino程序没有变,还可以用:
int nLED_Green=13;//绿灯
String comdata = "";//字符串
void setup()
& & Serial.begin(9600);
& & pinMode(nLED_Green,OUTPUT);//设置数字13口为输出接口
void loop()
& & while (Serial.available() & 0)&&
& && &&&comdata += char(Serial.read());
& && &&&delay(2);
& & if (comdata.length() & 0 && comdata=="on")
& && &&&//Serial.println("turn on LED");
& && &&&digitalWrite(nLED_Green,HIGH);//点亮灯。
& && &&&comdata = "";
& & else if(comdata.length() & 0 && comdata=="off")
& && &&&//Serial.println("turn off LED");
& && &&&digitalWrite(nLED_Green,LOW);//熄灭灯。
& && &&&comdata = "";
四、Arduino向计算机发送的数据运行程序(MFC)。
Arduino程序:
const int buttonPin = 12;& &&&// 12口作为按钮的接口
const int ledPin =&&13;& && &// 13口,LED
int buttonState = 0;& && && &// 按钮状态标志用的变量,初始化为0
void setup()
&&Serial.begin(9600);
&&pinMode(ledPin, OUTPUT);//LED为输出
&&pinMode(buttonPin, INPUT);//按钮是输入
void loop()
&&delay(200);
&&buttonState = digitalRead(buttonPin);//读取按钮的状态
&&if (buttonState == HIGH)
& & Serial.println("open");//发送命令
& & delay(600);
MFC主要程序代码(新建了一个线程来处理,也可以定时器来读取串口内容):
int ThreadFunc()
& & HANDLE hC
& & int nON=1;
& & hCom=CreateFile(TEXT("COM3"),//COM3口
& && &&&GENERIC_READ|GENERIC_WRITE, //允许读和写
& && &&&0, //独占方式
& && &&&NULL,
& && &&&OPEN_EXISTING, //打开而不是创建
& && &&&0, //同步方式
& && &&&NULL);
& & if(hCom==(HANDLE)-1)
& && &&&//printf("打开COM失败!\n");
& && &&&return FALSE;
& && &&&//printf("COM打开成功!\n");
& & SetupComm(hCom,); //输入缓冲区和输出缓冲区的大小都是1024
& & COMMTIMEOUTS TimeO
& & //设定读超时
& & TimeOuts.ReadIntervalTimeout=1000;
& & TimeOuts.ReadTotalTimeoutMultiplier=500;
& & TimeOuts.ReadTotalTimeoutConstant=5000;
& & //设定写超时
& & TimeOuts.WriteTotalTimeoutMultiplier=500;
& & TimeOuts.WriteTotalTimeoutConstant=2000;
& & SetCommTimeouts(hCom,&TimeOuts); //设置超时
& & GetCommState(hCom,&dcb);
& & dcb.BaudRate=9600; //波特率为9600
& & dcb.ByteSize=8; //每个字节有8位
& & dcb.Parity=NOPARITY; //无奇偶校验位
& & dcb.StopBits=ONE5STOPBITS; //两个停止位
& & SetCommState(hCom,&dcb);
& & DWORD wC//读取的字节数
& & BOOL bReadS
& & while(1)
& && &&&PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区
& && &&&char str[5]={0};
& && &&&bReadStat=ReadFile(hCom,str,4,&wCount,NULL);
& && &&&if(!bReadStat)
& && && && &return FALSE;
& && &&&str[4]='\0';
& && &&&if(strcmp(str,"open")==0 && nON == 1)
& && && && &ShellExecute(NULL,"open","C:\\1.txt",NULL,NULL,SW_NORMAL);
& && && && &myputs("程序已运行");
& && && && &nON = 0;
& && &&&memset(str,0,5);
& && &&&Sleep(500);
最后,你可以把我写的程序整合一下,就可以变成双向控制了。
参考资料:
http://blog.csdn.net/zw0558/article/details/4465814
上传的附件:
(27.58kb,9次下载)
(48.25kb,4次下载)
(19.41kb,5次下载)
(32.59kb,5次下载)
(36.13kb,20次下载)
(38.97kb,19次下载)
(6.71kb,20次下载)
(7.37kb,20次下载)
(197.50kb,22次下载)
支付方式:
最新回复 (4)
good job!
老v也会关注这个?
话说 ardunio,树莓,xX啊
我去年玩了半年智能XX和XX
做产品么?我弄过ardunio和stm32
1.请先关注公众号。
2.点击菜单"更多"。
3.选择获取下载码。玩转 Arduino ——数据通信:串口通信
(评价人数不足)
知识量:--
授课水平:--
实用性:--
课程设计:--
难度:简单
开始时间:时间自主
持续时间:暂无
课程背景:物联网即物物相联的互联网,数据通信在物联网应用中占有很大的比重。本课程讲解数据通信的基本概念以及常用的Arduino数据通信中的串口通信方式。核心内容:1.数据通信的基本概念。2.通信协议的基本要素。3.Arduino中串口通信的原理。4.简单的串口通信协议的设计。软件环境:Arduino IDE、Fritzing是否提供资料:否课程等级:初级适合人群:零基础的嵌入式、物联网、智能硬件的爱好者//打开串口
Serial.begin(<span style="color: #00);
//获取串口上可读取的数据的字节数。该数据是指已经到达并存储在接收缓存(共有64字节)中
Serial.available();
//读串口数据,串口上第一个可读取的字节(如果没有可读取的数据则返回-1)- int型
Serial.read();
//读串口数据,读取全部字节,并返回字节数Serial.readBytes(usbBuffer, USB_BUFFER_SIZE);
//刷新串口数据
Serial.flush();
//串口发送数据,无换行
Serial.print(val)
Serial.print(val, format)
//可选的第二个参数用于指定数据的格式。
// 允许的值为:BIN (binary二进制), OCT (octal八进制), DEC (decimal十进制), HEX
(hexadecimal十六进制)。
对于浮点数,该参数指定小数点的位数。
//你可以用F()把待发送的字符串包装到flash存储器。例如:&&&& Serial.print(F(“Hello World”))& //发送单个字节
Serial.write();
//往串口发数据,类似Serial.print(),但有换行
Serial.println();
//写二进制数据到串口,数据是一个字节一个字节地发送的,若以字符形式发送数字请使用print()代替
Serial.write();
Serial.write(val)
//val: 作为单个字节发送的数据
Serial.write(str)
// str: 由一系列字节组成的字符串
Serial.write(buf, len)
//buf: 同一系列字节组成的数组
len: 要发送的数组的长度
//返回: byte
write()会返回发送的字节数,所以读取该返回值是可选的
阅读(...) 评论()论文发表、论文指导
周一至周五
9:00&22:00
利用串口实现Arduino双机多通道数据传输
  摘要:近年来随着计算机技术,移动信息以及物联网技术的不断发展,移动互联网的成熟运用,物联网为我们的生活带来了很大的方便,越来越多的应用场合中需要嵌入式系统进行无线传输。本文研究了Arduino系统利用无线串口实现双机多通道数据传输的方法,实现了数据传输时的同步与校验。 中国论文网 /8/view-7446670.htm  关键词: Arduino串口多通道 数据传输   中图分类号:TN923 文献标识码:A 文章编号:(0-00   1 需求概述   Arduino是当前最流行的开源电子平台之一,易于上手节约学习成本,缩短了开发周期,从日常生活中的智能小装置到3D打印机,Arduino让人们发现很多以前只有专业人员才能进入的领域普通爱好者也是可以涉足的。   在一个五轴机械臂项目中,需要使用5个电位器对机械臂的相应关节进行遥控,一般通用的采用PPM控制方式的模型遥控器只有两个十字摇杆,在数量上以及操作方式上都无法满足需求,因此笔者用两个Arduino实现了多通道控制信号的发送与接收。   2 Arduino的串口通信   在单片机的实际应用中,串口通信非常普遍,只需少量几根线就能和其他串口设备通讯。 Arduino是通过USB转成TTL串口下载程序的,数字接口D0和D1就是TTL串口中的RX和TX。Arduino中提供了十余个串口相关函数,使用Serial.begin()指定传输时的波特率即可,例如Serial.begin(9600),表示速率为9600bit/s,收发双方的速率要保持一致。在程序中,使用Serial.print() 函数可以从串口输出我们需要的变量或者字符串信息(以ASCII文本方式),利用IDE中的串口监视器,开发者可以查看单片机输出的信息,这也是调试程序的主要手段之一。此外,还有一个Serial.write()方法,不同于print方法,此方法是把二进制数据输出到串口。   3 收发实现   以5通道遥控为例,笔者设计的收发同步与校验方案如下:发射端的Arduino每组发送7个数据,第1个为同步起始标记(255,即8个二进制1),然后是5个控制信号(s1~s5),每个信号用于操作指定关节的舵机,此外还需要一个校验数据,本文采用了较简单的校验方式,把5路信号值相加作为校验数据一并发送出去。本项目中采用的是数据发送方式,Serial.write()方法发送的数据只能有1个字节,也就是0-255之间的整数。如果s1到s5累加得到的数据超过255,系统会舍弃高位部分,只发送低位的字节。   因为串口接收的数据只有1个字节,所以计算校验数据时需要把s1到s5的和强制类型转换为byte类型,这样才可以和接收到的校验数据serv[6]做比较,在接收端的串口监视器中可以看到,每一秒都会接收到一组数据,和发送方传出的数据完全一致,收发功能顺利实现。   图1所示,Arduino中的串口传输非常简单方便,我们可以看到在程序中没有任何涉及蓝牙或者其他无线串口模块的特殊命令,本文中笔者使用的是基于SI4432芯片的无线串口透传模块,只需要两个配置相同的模块分别接在收发两端的Arduino上即可(模块和Arduino的RX和TX接口交叉连接),如果使用蓝牙模块,其电路接法与程序都不需要变化,只需要提前使用AT命令给2个蓝牙模块进行主从配对即可。   因为Arduino程序上传也是通过串口实现的,为了避免冲突,在更新程序时需要先把串口设备的RX/TX线断开,否则无法上传程序。   参考文献   [1]赵志,著.Arduino开发实战指南[M].机械工业出版社,2015.   [2]陈吕洲,著.Arduino程序设计基础[M].北京航天航空出版社,2014.
转载请注明来源。原文地址:
【xzbu】郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。
xzbu发布此信息目的在于传播更多信息,与本网站立场无关。xzbu不保证该信息(包括但不限于文字、数据及图表)准确性、真实性、完整性等。

我要回帖

更多关于 stm32串口接收数据 的文章

 

随机推荐