本文章只是一个简单的例程,也是我个人小项目过程中的一小部分,整个过程我将会陆续开源,方便大家学习和讨论,也给自己留个痕迹。因为自己从来没接触过这块儿,也属于小白范畴,所以本文的内容可能会有不足的地方,希望大家不要见怪,大家都是在学习。好了不多说题外话了,进入正题:
使用vc实现串口通信有很多种方法,都可以在参考书内和网上找到解决方法。因为把PC作为上位机arduino作为下位机,arduino接收vc通过串口传送过来的数据,这里我将不使用MSComm控件,使用的是WinAPI进行串口通信程序设计。
这里假设大家都已经了解了串口通信。vc部分程序的思路是:创建串口--设置串口参数--发送消息--关闭串口
参考程序如下:
vc部分:
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
char test[] = "10,8,180";
//创建串口 句柄为hDevice
HANDLE hDevice = CreateFile(L"COM2", //选择COM口
GENERIC_READ | GENERIC_WRITE, //使用读写方式
0,
0,
OPEN_EXISTING,
0,
0);
if (hDevice !=INVALID_HANDLE_VALUE)
{
printf("Port opened! \n");
DCB lpTest;
GetCommState(hDevice,&lpTest); //获取当前的参数设置
lpTest.BaudRate = CBR_19200; //波特率为19200
lpTest.ByteSize = 8; //数据位数为8
lpTest.Parity = NOPARITY; //无校验
lpTest.StopBits = ONESTOPBIT; //1位停止位
SetCommState(hDevice,&lpTest); //设置通信参数
DWORD btsIO;
WriteFile(hDevice,test,strlen(test),&btsIO,NULL); //发送数据
CloseHandle(hDevice); //关闭串口
}
//_getch();
return 0;
}
arduino通过串口接收数据部分代码:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);
//定义一个comdata字符串变量,赋初值为空值
String comdata = "";
//numdata是分拆之后的数字数组
int numdata[3] = {0};
int mark = 0;
void setup()
{
lcd.init();
lcd.backlight();
Serial.begin(9600);
}
void loop()
{
int j=0;
if (Serial.available())
{
delay(100);
lcd.clear();
while (Serial.available() > 0)
{
comdata += char(Serial.read());
delay(2);
mark = 1;
}
if(mark == 1)
{
//lcd.print(comdata);
//lcd.print(comdata.length());
for(int i = 0;i<comdata.length();i++)
{
if(comdata[i] == ',')
{
j++;
}
else
{
numdata[j] = numdata[j]*10+(comdata[i]-'0');
}
}
comdata = String("");
lcd.print(numdata[0]);
for(int i = 0;i<3;i++)
{
//lcd.print(numdata[i]);
numdata[i]=0;
}
mark = 0;
}
}
}
arduino部分的代码,意思是接收串口的的数据,并放置在一个新的字符串中,然后遍历整个字符串遇到 “,”时,就将前面的整数放置在一个整型数组中,如此循环。最后print或者任其为己用
以上代码均通过运行且正常。
不记得上面的理论知识时请参考书串口通信与工程应用篇。