發送的字串指令可以控制機械臂轉動,我通過串口助手發送相同的指令可以實作功能,但是使用下面的程式發送,機械臂沒反應,也嘗試了使用串口自發自收,程式發送的資料和串口助手發送的資料是一樣的,希望有大佬可以指點一下。
#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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/283991.html
標籤:硬件/系統
