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;
}
#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;
}
...全文
相关推荐
MFC串口-VS2017-收发.zip
平台:VS2017,MFC上位机之串口收发,波特率程序内设定;十六进制与字符发送指令;hex显示或字符串显示;创建步骤、代码实现和错误分析在我的博客里
MFC实现串口通信16进制发送接收
利用MFC实现串口通信,用到MSCOMM32控件,能控制发送的时间,最短1ms,同时支持16进制和字符型的接收和发送,功能很强大,基于VS2010编写,研究MFC串口通信的同学值得拥有!
Qt蓝牙串口源码支持十六进制发送、字符发送、定时发送
1、可以使用vs2019/vs2017 Qt进行编译 2、源码说明链接:https://mingshiqiang.blog.csdn.net/article/details/80733737
基于vs2019的串口调试助手
基于vs2019用了mscomm的控件,可以拿来参考一下,包括EXE执行文件与工程项目。端口配置可以用滚轮控制,并不是下拉界面 ,不喜欢可以自行在项目rc中修改
VS2010之MFC串口通信的编写教程
VS2010之MFC串口通信的编写教程,详细参考:http://blog.csdn.net/peter_jjh/article/details/77294592


硬件/系统
