VS2017上向串口发送字符串指令

xhenxu 2021-05-14 02:17:38
发送的字符串指令可以控制机械臂转动,我通过串口助手发送相同的指令可以实现功能,但是使用下面的程序发送,机械臂没反应,也尝试了使用串口自发自收,程序发送的数据和串口助手发送的数据是一样的,希望有大佬可以指点一下。


#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;
}
...全文
260 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhenxu 2021-05-16
引用 4 楼 xhenxu的回复:
[quote=引用 3 楼 zgl7903的回复:]串口助手 16进制查看 bwriteStat = WriteFile(hCom, str, 40, &wCount, NULL); 这个长度对么?
你好,这个参数是表示写入的字符个数吧,我要写入的字符串长度是小于40的,应该是可以的吧[/quote] 你好,我已经解决了,我以前用串口助手发送字符串的时候,软件默认后面有回车符号,我的上面代码里面应该要自己加一个回车符号。 还是非常感谢您的帮助
  • 打赏
  • 举报
回复
zgl7903 2021-05-16
把发送的数据 用另一个串口+串口助手接收, 对比下看看
  • 打赏
  • 举报
回复
xhenxu 2021-05-16
引用 3 楼 zgl7903的回复:
串口助手 16进制查看 bwriteStat = WriteFile(hCom, str, 40, &wCount, NULL); 这个长度对么?
你好,这个参数是表示写入的字符个数吧,我要写入的字符串长度是小于40的,应该是可以的吧
  • 打赏
  • 举报
回复
zgl7903 2021-05-16
串口助手 16进制查看 bwriteStat = WriteFile(hCom, str, 40, &wCount, NULL); 这个长度对么?
  • 打赏
  • 举报
回复
xhenxu 2021-05-16
引用 1 楼 zgl7903的回复:
把发送的数据 用另一个串口+串口助手接收, 对比下看看
你好,我两个电脑用TTL转串口连接起来之后,发现代码发送的数据,和串口助手发送的数据是一样的
  • 打赏
  • 举报
回复
发帖
硬件/系统

2614

社区成员

VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
帖子事件
创建了帖子
2021-05-14 02:17
社区公告
暂无公告