VS2017上向串口发送字符串指令
发送的字符串指令可以控制机械臂转动,我通过串口助手发送相同的指令可以实现功能,但是使用下面的程序发送,机械臂没反应,也尝试了使用串口自发自收,程序发送的数据和串口助手发送的数据是一样的,希望有大佬可以指点一下。
#include "UART.h"
//串口变量
HANDLE hCom;
DWORD wCount;//实际读取的字节数
BOOL bwriteStat;
BOOL bReadStat;
const char str[81] = "#L18A180H15T1000Z" ;//初始化数组
unsigned char strs[81] = { 0 };
void UART_Init()
{
hCom = CreateFile(TEXT("COM6"),//COM3口
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if (hCom == (HANDLE)(-1))//是把 -1强制转换成 HANDLE类型.
{
printf("打开COM失败!\n");
//return FALSE;
}
else
{
printf("COM打开成功!\n");
}
SetupComm(hCom, 1024, 1024); //输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;//调用COMMTIMEOUTS结构体, 成员的单位都以毫秒为单位。
//设定读超时
TimeOuts.ReadIntervalTimeout = 1000;//接收时,两字符间最大的时延
TimeOuts.ReadTotalTimeoutMultiplier = 500;//读时间系数
TimeOuts.ReadTotalTimeoutConstant = 5000;//读时间常量
//设定写超时 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant
TimeOuts.WriteTotalTimeoutMultiplier = 500;// 写每字节的超时
TimeOuts.WriteTotalTimeoutConstant = 2000;//写串口数据的固定超时
SetCommTimeouts(hCom, &TimeOuts); //设置超时
DCB dcb;//调用BCB结构体
GetCommState(hCom, &dcb); //GetCommState函数可以获得COM口的设备控制块,从而获得相关参数 读取串口设置(波特率,校验,停止位,数据位等).
dcb.BaudRate = 115200; //波特率为115200
dcb.ByteSize = 8; //每个字节有8位
dcb.Parity = NOPARITY; //无奇偶校验位
dcb.StopBits = ONE5STOPBITS; //一个停止位
SetCommState(hCom, &dcb); //SetCommState函数设置COM口的设备控制块:
Sleep(80);
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); //PurgeComm()函数清空缓冲区
//PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);//在读写串口之前清空缓冲区
/*PURGE_TXCLEAR 这个命令指导设备驱动程序清除输出缓冲区,经常与PURGE_TXABORT 命令标志一起使用
PURGE_RXCLEAR 这个命令用于设备驱动程序清除输入缓冲区,经常与PURGE_RXABORT 命令标志一起使用*/
//DWORD wCount;//实际读取的字节数
//BOOL bReadStat;
}
void Write_UART()
{
//char str[41] = { 0 };//初始化数组
//unsigned char str[81] = { '%' };//初始化数组
//printf("%s", str);
bwriteStat = WriteFile(hCom, str, 40, &wCount, NULL);
//bReadStat = ReadFile(hCom, str, 80, &wCount, NULL);
/*ReadFile()函数 从指定的文件或者I/O设备中,读取数据。
如果该设备支持文件指针,读取的位置就是文件指针的位置。
这个函数被设置为同步和异步两种操作都支持。 */
if (!bwriteStat)
{
printf("写串口失败!");
//return FALSE;
}
else
{
printf("写串口成功!");
//printf("%lld", wCount);
}
}
int main()
{
int i;
UART_Init();
Write_UART();
Sleep(5 * 1000);
system("pause");
return 0;
}