#include "stdafx.h"
#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include<stdlib.h>
#include <WINDOWS.H>
using namespace std;
int main(int argc, char* argv[])
{
//定義機構體物件dcb
DCB dcb;
// 定義回傳狀態變數
BOOL status;
//定義錯誤號
DWORD error_number;
//定義埠名稱陣列
LPCWSTR port_name;
//LPCWSTR PORT;
//初始化狀態變數
status = TRUE;
//初始化埠名稱陣列
port_name = _T("COM2");
//memset(port_name,0,sizeof(port_name));
//埠名稱賦值
//1.打開指定串口
// 串口名稱(COMx)
//printf("%c",_T("COM2"));
HANDLE hComm = CreateFile(port_name
// 串口屬性為可讀/寫
,GENERIC_READ | GENERIC_WRITE
// 串口設備必須被獨占性的訪問
,0
// 無安全屬性
,0
// 串口設備必須使用OPEN_EXISTING引數
,OPEN_EXISTING
// 同步式 I/O
,0
// 對于串口設備而言此引數必須為0或NULL
,0);
//如果回傳的無效
if (hComm == INVALID_HANDLE_VALUE)
{
//如果該串口不存在或者正被另外一個應用程式使用,
//則打開失敗,本程式退出
cout<<"打開埠失敗"<<endl;;
//return(FALSE);
}
//2.設定串口引數:波特率、資料位、校驗位、停止位等資訊
//獲取該埠的默認引數GetCommState 讀取串口設定(波特率,校驗,停止位,資料位等).
if(!GetCommState(hComm, &dcb))
{
cout<<"獲取串口資訊失敗"<<endl;
//return(FALSE);
}
//修改波特率
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.fParity = 0;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
//重新設定引數
if(!SetCommState(hComm, &dcb))
{
error_number = GetLastError();
cout<<"串口賦值失敗"<<endl;
status =0;
}
//如果串口賦值失敗,則關閉串口
if(status != 1)
{
cout<<"串口賦值失敗已關閉"<<endl;
CloseHandle(hComm);
system("pause");
return(status);
}
//3.往串口寫資料 //將要寫入的資料
char cWriteBuffer[10] = {1,2,3,4,5,6,7,8,9,0};
//將要寫入的資料長度
DWORD nNumberOfBytesToWrite = strlen(cWriteBuffer);
DWORD nBytesSent;
//DWORD nNumberOfBytesToWrite = sizeof(lpBuffer)/sizeof(lpBuffer[0]);
//執行寫操作
if(WriteFile(hComm,cWriteBuffer,nNumberOfBytesToWrite,&nBytesSent,NULL)==TRUE)
{
//nBytesSent+=1;
if(nNumberOfBytesToWrite != nBytesSent)
{
cout<<"資料發送失敗"<<endl;
}
else
cout<<"資料發送成功"<<endl;
}
//4.往串口讀資料 //將要讀入的資料
SetFilePointer(hComm, 0, 0, FILE_BEGIN) ;
TCHAR cReadBuffer[1024]={};
//TCHAR cReadBuffer[1024]
//將要寫入的資料長度
DWORD nNumberOfBytesToRead = _tcslen(cReadBuffer);
//printf("%d\n", nNumberOfBytesToRead);
DWORD nBytesReceive;
SetupComm(hComm,1024,1024); //輸入緩沖區和輸出緩沖區的大小都是1024
COMMTIMEOUTS TimeOuts; //設定讀超時
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000; //設定寫超時
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hComm,&TimeOuts); //設定超時
if( ReadFile(hComm,cReadBuffer,nNumberOfBytesToRead,&nBytesReceive,NULL) == TRUE)
{
cout<<"讀取資料成功,資料如下:"<<endl;
printf("%d",cReadBuffer);
}
system("pause");
//4.關閉串口
CloseHandle(hComm);
// system("pause");
return 0;
}
現在輸出為
資料發送成功
讀取資料成功,資料如下
***(亂數)請按任意鍵繼續。。。。。
將陣列后面定義的括號去掉后
改為TCHAR cReadBuffer[1024];輸出為
資料發送成功
接收到串口資料后列印亂碼
問:1、為什么輸出是亂碼,怎么才能列印正常?
2、為什么陣列定義以后就直接讀取了,不希望它直接讀取而是等串口資料,怎么操作?
在線等 謝了
uj5u.com熱心網友回復:
僅供參考:void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
uj5u.com熱心網友回復:
老師您好,這個沒解決我的問題啊,您可以把我的代碼復制到vs里試一下,幫我看看,謝謝啦
uj5u.com熱心網友回復:
可以參考這個http://blog.csdn.net/cvbtvbwu/article/details/24694739里的串口例程,進行串口讀寫轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/116843.html
標籤:基礎類
