使用Win32 API函数实现vc和arduino简单串口通信

本文介绍了一种不使用MSComm控件,而是利用Win32 API函数在VC中实现与Arduino串口通信的方法。程序思路包括创建串口、设置参数、发送数据和关闭串口。在Arduino端,接收到的数据会被解析并存储到整型数组中。代码已验证可行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       本文章只是一个简单的例程,也是我个人小项目过程中的一小部分,整个过程我将会陆续开源,方便大家学习和讨论,也给自己留个痕迹。因为自己从来没接触过这块儿,也属于小白范畴,所以本文的内容可能会有不足的地方,希望大家不要见怪,大家都是在学习。好了不多说题外话了,进入正题:

      使用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或者任其为己用

 

以上代码均通过运行且正常。

    不记得上面的理论知识时请参考书串口通信与工程应用篇。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值