计算机COM口数据测试
一、基本使用流程

程序需要以管理员身份运行,COM口回路测试需短接2,3pin,测试时候使用控制台,配置测试相关路径,并在测试完成后

1.测试配置路径D:\bigdata\INI\FWCOM.ini

2.测试完成后需要在路径D:\bigdata\LOG\生成测试FWCOM.log文件

程序运行结果示意图

运行完成后的日志文件示意图

二、软件设计
源码分为三个部分,common.cpp基本基本信息配置,function.cpp完成功能实现,最后通过main.cpp运行整个程序

common.cpp

配置函数代码
#undef UNICODE
#include "common.h"
#include "Config.h"
void TextColor(int color)
{
HANDLE stdH = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(stdH, color);
}
void PASS()
{
printf("The test is: "); TextColor(GREEN);
printf("passed");
printf("\n");
printf("\n");
TextColor(WHITE); }
void FAIL()
{
printf("The test is: "); TextColor(RED);
printf("failed");
printf("\n");
printf("\n");
TextColor(WHITE); }
DWORD SubSystemID(MBTYPE mb[])
{
DWORD decSubSystemID = 0;
DWORD aimSubSystemID = 0;
// BYTE bus = pciSelect[0], dev = pciSelect[1], func = pciSelect[2], offset = 0x2c;
BYTE bus = 0;
BYTE dev = 0;
BYTE func = 0;
BYTE offset = 0;
DWORD address = 0;
for (int i = 0; i < sizeof(mb); i++)
{
// printf("i = %d\n", i); if (mb[i].subSystemId != 0)
{
bus = mb[i].bus;
dev = mb[i].dev;
func = mb[i].fun;
offset = mb[i].subSystemIdOffset;
aimSubSystemID = mb[i].subSystemId;
address = MAKE_CONFIG_ADDRESS(bus, dev, func, offset);
FoxLib_SetPortVal(PCI_CONFIG_ADDRESS, address, 4);
FoxLib_GetPortVal(PCI_CONFIG_DATA, &decSubSystemID, 4);
#ifdef DEBUG
printf("aimSubSystemID = \"%x\", decSubSystemID = \"%x\"\n", aimSubSystemID, decSubSystemID);
#endif
if (aimSubSystemID == decSubSystemID)
{
return 0;
} } }
printf("Not support MB!\n");
return 1;
}
void GetGlobalData(char* name)
{
int i = 0;
int index = 0;
int toolSelect = 0;
if (strstr(name, "hwm") != NULL)
{
index = 1;
for (i = 0; i < cTINumberMax; i++)
{
if (cFanName[i][0] != '\0')
{
iFanIndex[index] = i;
index++;
iAllFanNum++;
}
}
index = 1;
for (i = 0; i < cTINumberMax; i++)
{
if (cTempName[i][0] != '\0')
{
iTempIndex[index] = i; index++;
iAllTempNum++;
}
}
#ifdef DEBUG
printf("iAllFanNum = %d, iAllTempNum = %d\n", iAllFanNum, iAllTempNum);
#endif }
else if (strstr(name, "idchk") != NULL)
{
index = 1;
for (i = 0; i < cTINumberMax; i++)
{
if (cIdChkName[i][0] != '\0')
{
iIdChkIndex[index] = i;
index++;
iAllIdChkNum++;
}
}
#ifdef DEBUG
printf("iAllIdChkNum = %d\n", iAllIdChkNum);
#endif }
else if (strstr(name, "pcie") != NULL)
{
index = 1;
for (i = 0; i < cTINumberMax; i++)
{
if (cPcieName[i][0] != '\0')
{
iPcieIndex[index] = i;
index++;
iAllPcieNum++;
}
}
#ifdef DEBUG
printf("iAllPcieNum = %d\n", iAllPcieNum);
#endif }
else if (strstr(name, "sata") != NULL)
{
index = 1;
for (i = 0; i < cTINumberMax; i++)
{
if (cSataSpdName[i][0] != '\0')
{
iSataSpdIndex[index] = i;
index++;
iAllSataSpdNum++;
}
}
#ifdef DEBUG
printf("iAllSataSpdNum = %d\n", iAllSataSpdNum);
#endif }
else if (strstr(name, "fntpnl") != NULL)
{
index = 1;
for (i = 0; i < cTINumberMax; i++)
{
if (cFntpnlName[i][0] != '\0')
{
iFntpnlIndex[index] = i;
index++;
iAllFntpnlNum++;
}
}
#ifdef DEBUG
printf("iAllFntpnlNum = %d\n", iAllFntpnlNum);
#endif }
else if (strstr(name, "jumper") != NULL)
{
index = 1;
for (i = 0; i < cTINumberMax; i++)
{
if (cJumperName[i][0] != '\0')
{
iJumperIndex[index] = i;
index++;
iAllJumperNum++;
}
}
#ifdef DEBUG
printf("iAllJumperNum = %d\n", iAllJumperNum);
#endif } } int GetDataFromConfig(char* fileName, char* dataConfigAppName, char configItemKey[CONFIGNUM][CONFIGDATALENGTH], char dataArray[CONFIGNUM][CONFIGDATALENGTH])
{
int ret = 0;
LPTSTR lpReturnedString = NULL;
LPCTSTR lpFileName = NULL; lpReturnedString = (char*)malloc(MAX_PATH);
memset(lpReturnedString, 0, MAX_PATH); int itemNum = 0;
int itemOffset = 0;
while (1)
{ GetPrivateProfileString(dataConfigAppName, configItemKey[itemNum], NULL, lpReturnedString, MAX_PATH, fileName);
if (*lpReturnedString == '\0')
{
#ifdef DEBUG
printf("Input data error\n");
printf("-- dataConfigAppName = %s, itemKey = %s, lpReturnedString = %s, fileName = %s\n", dataConfigAppName, configItemKey[itemNum], lpReturnedString, fileName);
#endif
ret = 1;
break;
}
else
{
itemOffset = 0;
while (lpReturnedString)
{
if (*lpReturnedString == '\0')
{
break;
}
dataArray[itemNum][itemOffset] = *lpReturnedString;
itemOffset++;
lpReturnedString++; }
lpReturnedString -= itemOffset;
#ifdef DEBUG
printf("dataConfigAppName = %s, itemKey = %s, lpReturnedString = %s, fileName = %s\n", dataConfigAppName, configItemKey[itemNum], lpReturnedString, fileName);
#endif itemNum++;
}
memset(lpReturnedString, 0, strlen((char*)lpReturnedString)); } return ret;
}
int LogName(char* logName, char* configName)
{
int lengthConName = strlen(configName);
int i = 0;
for (i = 0; i < (lengthConName - 4); i++)
{
*logName = *configName;
logName++;
configName++;
} logName -= i; sprintf(logName, "%s.TXT", logName);
#ifdef DEBUG
printf("*logName = \"%s\"\n", logName);
#endif
FILE* fd = NULL;
fd = fopen(lpLogFileName, "a+");
if (fd == NULL)
{
printf("Create the log file %s failed\n", lpLogFileName);
return 1;
}
return 0;
}

functonc.cpp

功能函数代码
#include "function.h"
#include "..\Common\ExConfig.h" #define BASSADDRONE 0x3F8
HANDLE hCom;
DCB dcb = { sizeof(DCB) };
char com[5];
int Baudrate[3] = { 0 };
DWORD send_data = 'E';
DWORD resv_data = 'A'; /*
函数功能:设置串口(com)基本配置信息
参数: baudrate 波特率
cts (clear to send)清除发送
dtr (data set ready)数据终端准备好
rts (request to send)请求数据发送
dsr (data set ready)数据准备好
errorcode 错误代码
支持硬控件流的UART
*/
int SerialSetting(int baudrate, int cts, int dtr, int rts, char errorCode[])
{
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE; if (hCom != INVALID_HANDLE_VALUE)
{
CloseHandle(hCom);
} hCom = CreateFile(com, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hCom == INVALID_HANDLE_VALUE) {
strcpy_s(itemLog[iItemLogNum].TM_STATUS, "FAIL");
strcpy_s(itemLog[iItemLogNum].TM_FAILINFO, "DEVICE NO FOUND");
strcpy_s(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
TextColor(RED);
printf("%s NO FOUND\n\n", com);
TextColor(WHITE);
iItemLogNum++;
return 1;
}
system("pause");
GetCommState(hCom, &dcb);
dcb.BaudRate = baudrate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fOutxCtsFlow = cts;
dcb.fDtrControl = dtr;
dcb.fRtsControl = rts; int fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess) return 1;
int maskstatus = SetCommMask(hCom, EV_RXCHAR);
if (maskstatus == 0) return 1;
int setupstatus = SetupComm(hCom, 4096, 4096);
if (setupstatus == 0) return 1;
int purgestatus = PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
if (purgestatus == 0) return 1; COMMTIMEOUTS CommTimeouts;
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutConstant = 1000;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 1000;
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
BOOL bTimeOutResult = SetCommTimeouts(hCom, &CommTimeouts);
if (bTimeOutResult == 0) return 1;
return 0;
} //串口初始化
int InitCOMOne()
{
int Status = 0; //状态(成功或失败)
DWORD sataStatus = 0x0; //读写地址数据 Status = FoxLib_SetPortVal(BASSADDRONE + 1, 0, 1);
if (Status != 0x0)
return Status; Status = FoxLib_SetPortVal(BASSADDRONE + 3, 0x80, 1);
if (Status != 0x0)
return Status; FoxLib_GetPortVal(BASSADDRONE + 0, &sataStatus, 1); Status = FoxLib_SetPortVal(BASSADDRONE + 0, 0x0C, 1);
if (Status != 0x0)
return Status; Status = FoxLib_SetPortVal(BASSADDRONE + 1, 0x00, 1);
if (Status != 0x0)
return Status; Status = FoxLib_SetPortVal(BASSADDRONE + 3, 0x03, 1);
if (Status != 0x0)
return Status; return 0x0;
} //串口发送数据
int Send_COMOne(DWORD my_date)
{
int Status = 0; //状态(成功或失败)
DWORD sataStatus = 0x0; //读写地址数据
UINT32 count = 10000; FoxLib_GetPortVal(BASSADDRONE + 5, &sataStatus, 1); while (!(sataStatus & 0x20) && (count > 0))
{
count--;
FoxLib_GetPortVal(BASSADDRONE + 5, &sataStatus, 1);
} if (count > 0)
{
printf("Count:%d\n", count);
Status = FoxLib_SetPortVal(BASSADDRONE + 0, my_date, 1);
if (Status != 0x0)
{
return Status;
}
printf("Send_COM data %c ", my_date); //发送数据打印
TextColor(GREEN);
printf("Success!\n");
TextColor(WHITE);
return 0x0;
}
else
{
printf("Send_COM data %c ", my_date);
TextColor(RED);
printf("Failed!\n\n");
TextColor(WHITE);
return 0x01;
} } //串口接收数据
int Recv_COMOne(DWORD* my_date)
{ DWORD sataStatus = 0; //读写地址数据
UINT8 cn = 0; while (cn < 100)
{
FoxLib_GetPortVal(BASSADDRONE + 5, &sataStatus, 1);
if (sataStatus & 0x01)
break;
else
{
Sleep(100);
cn++;
}
}
FoxLib_GetPortVal(BASSADDRONE + 5, &sataStatus, 1);
if (sataStatus & 0x01)
{
FoxLib_GetPortVal(BASSADDRONE + 0, my_date, 1);
printf("Recv_COM data %c ", *my_date);
TextColor(GREEN);
printf("Success!\n");
TextColor(WHITE);
return 0x0;
}
else
{
printf("Received data ");
TextColor(RED);
printf("Failed!\n\n");
TextColor(WHITE);
return 0x01;
}
} int IDCheckMain(char* fileName, char dataConfigAppName[cTINumberMax][cTINameMax], BYTE Num)
{
int ret = 0;
WORD venID = 0, devID = 0, revID = 0;
char dataConfigArray[CONFIGNUM][CONFIGDATALENGTH];
memset(dataConfigArray, 0, CONFIGNUM * CONFIGDATALENGTH);
char aimTestLocation[30] = { '\0' };
char aimTestErrorcode[30] = { '\0' };
strcpy(headLog.T_DEVICE, "IdCheck"); int iNum = 0; #ifdef DEBUG
printf("Num = %d, iIdChkCurrentNum = %d, iAllIdChkNum + 1 = %d\n", Num, iIdChkCurrentNum, iAllIdChkNum + 1);
#endif
if (iIdChkCurrentNum == (iAllIdChkNum + 1))
{
strcpy(headLog.T_CAPTION, "All"); for (iNum = 1; iNum < iIdChkCurrentNum; iNum++)
{ GetDataFromConfig(fileName, dataConfigAppName[iIdChkIndex[iNum]], configItemKeyIDchk, dataConfigArray);
venID = AtoX(dataConfigArray[0]);
memset(dataConfigArray[0], 0, strlen((char*)dataConfigArray[0])); devID = AtoX(dataConfigArray[1]);
memset(dataConfigArray[1], 0, strlen((char*)dataConfigArray[1])); revID = AtoX(dataConfigArray[2]);
memset(dataConfigArray[2], 0, strlen((char*)dataConfigArray[2])); strcpy(aimTestLocation, dataConfigArray[3]);
memset(dataConfigArray[3], 0, strlen((char*)dataConfigArray[3])); strcpy(aimTestErrorcode, dataConfigArray[4]);
memset(dataConfigArray[4], 0, strlen((char*)dataConfigArray[4])); #ifdef DEBUG
printf("**iFanNum = %d, venID = %X, devID = %X, revID = %X\n", iNum, venID, devID, revID);
printf("**aimTestLocation = %s\n", aimTestLocation);
printf("**aimTestErrorcode = %s\n", aimTestErrorcode);
#endif
ret += IDCheck(cIdChkName[iIdChkIndex[iNum]], venID, devID, revID, aimTestLocation, aimTestErrorcode); memset(aimTestLocation, 0, strlen(aimTestLocation));
memset(aimTestErrorcode, 0, strlen(aimTestErrorcode)); }
}
else
{
GetDataFromConfig(fileName, dataConfigAppName[iIdChkIndex[Num]], configItemKeyIDchk, dataConfigArray);
venID = AtoX(dataConfigArray[0]);
memset(dataConfigArray[0], 0, strlen((char*)dataConfigArray[0])); devID = AtoX(dataConfigArray[1]);
memset(dataConfigArray[1], 0, strlen((char*)dataConfigArray[1])); revID = AtoX(dataConfigArray[2]);
memset(dataConfigArray[2], 0, strlen((char*)dataConfigArray[2])); strcpy(aimTestLocation, dataConfigArray[3]);
memset(dataConfigArray[3], 0, strlen((char*)dataConfigArray[3])); strcpy(aimTestErrorcode, dataConfigArray[4]);
memset(dataConfigArray[4], 0, strlen((char*)dataConfigArray[4])); #ifdef DEBUG
printf("*venID = %X, devID = %X, revID = %X\n", venID, devID, revID);
printf("**aimTestLocation = %s\n", aimTestLocation);
printf("**aimTestErrorcode = %s\n", aimTestErrorcode);
#endif
strcpy(headLog.T_CAPTION, cIdChkName[Num]);
strcpy(headLog.T_LOCATION, aimTestLocation); ret = IDCheck(cIdChkName[Num], venID, devID, revID, aimTestLocation, aimTestErrorcode);
memset(aimTestLocation, 0, strlen(aimTestLocation));
memset(aimTestErrorcode, 0, strlen(aimTestErrorcode)); } tEndTime = getEndTime(endTime);
time(&tEndTime);
strcpy(headLog.T_ENDTIME, endTime);
memset(durTime, 0, LENGTHA);
sprintf(durTime, "%d", int(difftime(tEndTime, tStartTime)));
//getDURTime(tEndTime, tStartTime, durTime);
strcpy(headLog.T_DURATION, durTime); if (ret == 0)
{
strcpy(headLog.T_STATUS, "PASS");
}
else
{
strcpy(headLog.T_STATUS, "FAIL");
} HeadLogRecord(headLog);
for (int i = 0; i < iItemLogNum; i++)
{
ItemLogRecord(itemLog[i]);
}
WriteLogRecord(lpLogFileName);
return ret;
} DWORD getBusDevFun(DWORD code)
{
int iRet = 0;
BYTE offset = 0;
DWORD dwAddr = 0, dwData = 0, ClassCode = 0;
for (BYTE i = 0; i < 255; i++)
{
BYTE bus = i;
for (BYTE j = 0; j < 32; j++)
{
BYTE dev = j;
for (BYTE k = 0; k < 8; k++)
{
BYTE func = k;
//check the invalid vendor ID
offset = 0x00;
dwAddr = MAKE_CONFIG_ADDRESS(bus, dev, func, offset);
FoxLib_SetPortVal(PCI_CONFIG_ADDRESS, dwAddr, 4);
FoxLib_GetPortVal(PCI_CONFIG_DATA, &dwData, 4);
// dwData = 0xffffffff;
DWORD IDCode = dwData; if (code == IDCode)
{
return (bus << 16) + (dev << 8) + func;
}
}
}
}
return 0;
} //保留idcheck内容,但是这里不使用
int IDCheck(char para[], WORD inVenID, WORD inDevID, WORD inRevID, char subLocation[], char errorCode[])
{
int result = 1;
WORD venID = 0, devID = 0, revID = 0;
WORD devIdTemp1 = 0, devIdTemp2 = 0, devIdTemp3 = 0;
WORD devIdTemp = 0;
WORD devIDH = 0, devIDL = 0;
int bus = 0, dev = 0, func = 0;
DWORD dwAddr = 0, dwData = 0, classCode = 0;
BYTE indexPort = 0x2e, dataPort = 0x2f;
// BYTE byteData;
BYTE offset = 0;
BOOL flag = TRUE;
BOOL bLanOK = TRUE; WORD ecAddr = 0, ecAddrH = 0, ecAddrL = 0;
WORD ecData = 0;
//for creat log .txt if (strcmpi(para, "sio") == 0)
{
//ITE test should add next 4 lines to enter PNP mode
FoxLib_SetPortVal(indexPort, 0x87, 1);
FoxLib_SetPortVal(indexPort, 0x01, 1);
FoxLib_SetPortVal(indexPort, 0x55, 1);
FoxLib_SetPortVal(indexPort, 0x55, 1); //get the vendor (NUVOTON)
FoxLib_SetPortVal(0x2e, 0x20, 1);
FoxLib_GetPortVal(0x2f, (PDWORD)&devIdTemp1, 1);
FoxLib_SetPortVal(0x2e, 0x21, 1);
FoxLib_GetPortVal(0x2f, (PDWORD)&devIdTemp2, 1);
FoxLib_SetPortVal(0x2e, 0x22, 1);
FoxLib_GetPortVal(0x2f, (PDWORD)&devIdTemp3, 1);
venID = 0;
devID = (devIdTemp1 << 8) + devIdTemp2;
revID = devIdTemp3; strcpy(itemLog[iItemLogNum].TM_SUBLOCATION, "DeviceID");
strcpy(itemLog[iItemLogNum].TM_TESTITEM, para);
sprintf(itemLog[iItemLogNum].TM_EXPVALUE1, "%04X", inDevID);
sprintf(itemLog[iItemLogNum].TM_ACTVALUE1, "%04X", devID); if (inDevID != devID)
{
strcat(itemLog[iItemLogNum].TM_FAILINFO, "expValue not equal actValue_");
strcat(itemLog[iItemLogNum].TM_FAILINFO, "fail");
strcpy(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
strcpy(itemLog[iItemLogNum].TM_STATUS, "FAIL");
}
else {
strcpy(itemLog[iItemLogNum].TM_STATUS, "PASS");
} iItemLogNum++; strcpy(itemLog[iItemLogNum].TM_SUBLOCATION, "RevisionID");
strcpy(itemLog[iItemLogNum].TM_TESTITEM, para);
sprintf(itemLog[iItemLogNum].TM_EXPVALUE1, "%04X", inRevID);
sprintf(itemLog[iItemLogNum].TM_ACTVALUE1, "%04X", revID);
if (inRevID != revID)
{
strcat(itemLog[iItemLogNum].TM_FAILINFO, "expValue not equal actValue_");
strcat(itemLog[iItemLogNum].TM_FAILINFO, "fail");
strcpy(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
strcpy(itemLog[iItemLogNum].TM_STATUS, "FAIL");
}
else {
strcpy(itemLog[iItemLogNum].TM_STATUS, "PASS");
}
iItemLogNum++; }
else
{
if (strcmpi(para, "pch") == 0)
{
#ifdef DEBUG
printf("\n*********\n");
#endif
// bus 00 dev 1f func 00
/*int BusDevFun = getBusDevFun(0X06848086);
bus = (BusDevFun >> 16)&0xff;
dev = (BusDevFun >> 8)&0xff;
func = BusDevFun & 0Xff;*/ bus = 0x00;
dev = 0x1F;
func = 0x00; }
else if (strcmpi(para, "audio") == 0)
{
// bus 00 dev 1f func 03
/*int BusDevFun = getBusDevFun(0X06C88086);
bus = (BusDevFun >> 16) & 0xff;
dev = (BusDevFun >> 8) & 0xff;
func = BusDevFun & 0Xff;*/ bus = 0x00;
dev = 0x1F;
func = 0x03;
}
else if (strcmpi(para, "lan") == 0)
{
int BusDevFun = getBusDevFun(0X816810EC);
bus = (BusDevFun >> 16) & 0xff;
dev = (BusDevFun >> 8) & 0xff;
func = BusDevFun & 0Xff;
} if (bLanOK == TRUE)
{
dwAddr = MAKE_CONFIG_ADDRESS(bus, dev, func, 0x00);
FoxLib_SetPortVal(PCI_CONFIG_ADDRESS, dwAddr, 4);
FoxLib_GetPortVal(PCI_CONFIG_DATA, &dwData, 4);
venID = (WORD)dwData;
devID = (WORD)(dwData >> 16); dwAddr = MAKE_CONFIG_ADDRESS(bus, dev, func, 0x08);
FoxLib_SetPortVal(PCI_CONFIG_ADDRESS, dwAddr, 4);
FoxLib_GetPortVal(PCI_CONFIG_DATA, &dwData, 4);
revID = (BYTE)dwData;
} strcpy(itemLog[iItemLogNum].TM_SUBLOCATION, "VendorID");
strcpy(itemLog[iItemLogNum].TM_TESTITEM, para);
sprintf(itemLog[iItemLogNum].TM_EXPVALUE1, "%04X", inVenID);
sprintf(itemLog[iItemLogNum].TM_ACTVALUE1, "%04X", venID);
if (inVenID != venID)
{
strcat(itemLog[iItemLogNum].TM_FAILINFO, "expValue not equal actValue_");
strcat(itemLog[iItemLogNum].TM_FAILINFO, "fail");
strcpy(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
strcpy(itemLog[iItemLogNum].TM_STATUS, "FAIL");
}
else {
strcpy(itemLog[iItemLogNum].TM_STATUS, "PASS");
}
iItemLogNum++; strcpy(itemLog[iItemLogNum].TM_SUBLOCATION, "DeviceID");
strcpy(itemLog[iItemLogNum].TM_TESTITEM, para);
sprintf(itemLog[iItemLogNum].TM_EXPVALUE1, "%04X", inDevID);
sprintf(itemLog[iItemLogNum].TM_ACTVALUE1, "%04X", devID);
if (inDevID != devID)
{
strcat(itemLog[iItemLogNum].TM_FAILINFO, "expValue not equal actValue_");
strcat(itemLog[iItemLogNum].TM_FAILINFO, "fail");
strcpy(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
strcpy(itemLog[iItemLogNum].TM_STATUS, "FAIL");
}
else {
strcpy(itemLog[iItemLogNum].TM_STATUS, "PASS");
}
iItemLogNum++; strcpy(itemLog[iItemLogNum].TM_SUBLOCATION, "RevisionID");
strcpy(itemLog[iItemLogNum].TM_TESTITEM, para);
sprintf(itemLog[iItemLogNum].TM_EXPVALUE1, "%04X", inRevID);
sprintf(itemLog[iItemLogNum].TM_ACTVALUE1, "%04X", revID);
if (inRevID != revID)
{
strcat(itemLog[iItemLogNum].TM_FAILINFO, "expValue not equal actValue_");
strcat(itemLog[iItemLogNum].TM_FAILINFO, "fail");
strcpy(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
strcpy(itemLog[iItemLogNum].TM_STATUS, "FAIL");
}
else {
strcpy(itemLog[iItemLogNum].TM_STATUS, "PASS");
}
iItemLogNum++; } if (venID == inVenID && devID == inDevID && revID == inRevID)
{
printf("aimvenid: %04X\t aimdevid: %04X\t aimrevid: %04X\n", inVenID, inDevID, inRevID);
printf("actvenid: %04X\t actdevid: %04X\t actrevid: %04X\n", venID, devID, revID);
printf("%s ID test is: ", para);
TextColor(GREEN);
printf("passed!\n");
TextColor(WHITE);
result = 0;
}
else
{
printf("aimvenid: %04X\t aimdevid: %04X\t aimrevid: %04X\n", inVenID, inDevID, inRevID);
printf("actvenid: %04X\t actdevid: %04X\t actrevid: %04X\n", venID, devID, revID);
printf("%s ID test is: ", para);
TextColor(RED);
printf("failed!\n");
TextColor(WHITE);
result = 1;
} return result;
} int FwComMain(char* fileName, char dataConfigAppName[cTINumberMax][cTINameMax], BYTE Num)
{
int nRetCode = 0;
int iNum = 0; char dataConfigArray[CONFIGNUM][CONFIGDATALENGTH];
memset(dataConfigArray, 0, CONFIGNUM * CONFIGDATALENGTH);
char aimTestLocation[30] = { '\0' };
char aimTestErrorcode[30] = { '\0' };
strcpy(headLog.T_DEVICE, "Serial Port"); #ifdef DEBUG
printf("Num = %d, iFCOMCurrentNum = %d, iAllFCOMNum + 1 = %d\n", Num, iFCOMCurrentNum, iAllFCOMNum + 1);
#endif
if (iFCOMCurrentNum == (iAllFCOMNum + 1))
{ for (iNum = 1; iNum < iFCOMCurrentNum; iNum++)
{ GetDataFromConfig(fileName, cFCOMName[iFCOMIndex[iNum]], configItemKeyFCOM, dataConfigArray); strcpy(aimTestLocation, dataConfigArray[1]);
memset(dataConfigArray[1], 0, strlen((char*)dataConfigArray[1])); strcpy(aimTestErrorcode, dataConfigArray[3]);
memset(dataConfigArray[3], 0, strlen((char*)dataConfigArray[3])); Baudrate[0] = atoi(dataConfigArray[4]);
memset(dataConfigArray[4], 0, strlen((char*)dataConfigArray[4])); Baudrate[1] = atoi(dataConfigArray[5]);
memset(dataConfigArray[5], 0, strlen((char*)dataConfigArray[5])); Baudrate[2] = atoi(dataConfigArray[6]);
memset(dataConfigArray[6], 0, strlen((char*)dataConfigArray[6])); #ifdef DEBUG
printf("**iFanNum = %d, Baudrate[0] = %d, Baudrate[1] = %d, Baudrate[2] = %d\n", iNum, Baudrate[0], Baudrate[1], Baudrate[2]);
printf("**aimTestLocation = %s\n", aimTestLocation);
printf("**aimTestErrorcode = %s\n", aimTestErrorcode);
#endif strcpy(headLog.T_CAPTION, aimTestLocation);
strcpy(headLog.T_LOCATION, aimTestLocation); nRetCode += FwCom(cFCOMName[iFCOMIndex[iNum]], aimTestLocation, aimTestErrorcode, Baudrate); memset(aimTestLocation, 0, strlen(aimTestLocation));
memset(aimTestErrorcode, 0, strlen(aimTestErrorcode)); }
}
else
{ GetDataFromConfig(fileName, cFCOMName[Num], configItemKeyFCOM, dataConfigArray); strcpy(aimTestLocation, dataConfigArray[1]);
memset(dataConfigArray[1], 0, strlen((char*)dataConfigArray[1])); strcpy(aimTestErrorcode, dataConfigArray[3]);
memset(dataConfigArray[3], 0, strlen((char*)dataConfigArray[3])); Baudrate[0] = atoi(dataConfigArray[4]);
memset(dataConfigArray[4], 0, strlen((char*)dataConfigArray[4])); Baudrate[1] = atoi(dataConfigArray[5]);
memset(dataConfigArray[5], 0, strlen((char*)dataConfigArray[5])); Baudrate[2] = atoi(dataConfigArray[6]);
memset(dataConfigArray[6], 0, strlen((char*)dataConfigArray[6])); #ifdef DEBUG
printf("*Baudrate[0] = %d, Baudrate[1] = %d, Baudrate[2] = %d\n", Baudrate[0], Baudrate[1], Baudrate[2]);
printf("**aimTestLocation = %s\n", aimTestLocation);
printf("**aimTestErrorcode = %s\n", aimTestErrorcode);
#endif strcpy(headLog.T_CAPTION, aimTestLocation);
strcpy(headLog.T_LOCATION, aimTestLocation); nRetCode = FwCom(cFCOMName[Num], aimTestLocation, aimTestErrorcode, Baudrate); memset(aimTestLocation, 0, strlen(aimTestLocation));
memset(aimTestErrorcode, 0, strlen(aimTestErrorcode)); } tEndTime = getEndTime(endTime);
time(&tEndTime);
strcpy(headLog.T_ENDTIME, endTime);
memset(durTime, 0, LENGTHA);
sprintf(durTime, "%d", int(difftime(tEndTime, tStartTime)));
strcpy(headLog.T_DURATION, durTime); if (nRetCode == 0)
{
strcpy(headLog.T_STATUS, "PASS");
}
else
{
strcpy(headLog.T_STATUS, "FAIL");
} HeadLogRecord(headLog);
for (int i = 0; i < iItemLogNum; i++)
{
ItemLogRecord(itemLog[i]);
}
WriteLogRecord(lpLogFileName); return nRetCode;
} int FwCom(char para[], char subLocation[], char errorCode[], int baudrate[])
{
int result = 1;
//for creat log .txt
strcpy(com, para);
strcpy(itemLog[iItemLogNum].TM_TESTITEM, para);
strcpy(itemLog[iItemLogNum].TM_SUBLOCATION, subLocation); for (int i = 0; i < 3; i++)
{
if (SerialSetting(Baudrate[i], FALSE, DTR_CONTROL_HANDSHAKE, RTS_CONTROL_TOGGLE, errorCode)) return 1; printf("%s initing.......\n", para);
result = InitCOMOne();
if (result != 0x0)
{
printf("COM initing ");
TextColor(RED);
printf("Failed!\n\n");
TextColor(WHITE);
strcpy(itemLog[iItemLogNum].TM_STATUS, "FAIL");
strcat(itemLog[iItemLogNum].TM_FAILINFO, "COM initing Fail!!!");
strcpy(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
iItemLogNum++;
return result;
} result = Send_COMOne(send_data);
if (result != 0x0)
{
strcpy(itemLog[iItemLogNum].TM_STATUS, "FAIL");
strcat(itemLog[iItemLogNum].TM_FAILINFO, "Send_COM Fail!!!");
strcpy(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
iItemLogNum++;
return result;
} Sleep(0x100); result = Recv_COMOne(&resv_data); //接收Recv_COMOne()函数的返回值 //接收失败,提示
if (result != 0x0)
{
strcpy(itemLog[iItemLogNum].TM_STATUS, "FAIL");
strcat(itemLog[iItemLogNum].TM_FAILINFO, "Recv_COM Fail!!!");
strcpy(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
iItemLogNum++;
return result;
} if (resv_data == send_data)
{
printf("COM Send&Receive Test ");
TextColor(GREEN);
printf("Passed!\n\n");
TextColor(WHITE);
strcpy(itemLog[iItemLogNum].TM_STATUS, "PASS");
iItemLogNum++;
return result;
}
else
{
printf("COM One Send&Receive Test Fail ");
TextColor(RED);
printf("Failed!\n\n");
TextColor(WHITE);
strcpy(itemLog[iItemLogNum].TM_STATUS, "FAIL");
strcat(itemLog[iItemLogNum].TM_FAILINFO, "COM Send&Receive Test Fail!!!");
strcpy(itemLog[iItemLogNum].TM_ERRORCODE, errorCode);
iItemLogNum++;
return 0x01;
}
}
return result;
}

main.cpp

主函数带代码
 #include "function.h"
#include "..\Common\ExConfig.h" #ifndef _DEBUG
#define new DEBUG_NEW
#endif void PromptInformation(char* name)
{
int i = 0;
printf("==========================================================================\n");
printf("*********Diag COM Tool for %s %s*********\n", projectName, FCOM);
printf("Usage:\n");
printf("\t%s [number| all] [ConfigFile]\n", name);
printf("Note:\n");
printf("\tnumber :\n");
for (i = 1; i <= iAllFCOMNum; i++)
{
if (i == 1)
{
printf("\t\t");
} printf("%d:\"%s\" ", i, cFCOMName[iFCOMIndex[i]]);
if (i == iAllFCOMNum)
{
printf("\n");
printf("\t\tAll: For all the number test \n"); }
}
printf("==========================================================================\n"); } int main(int argc, char* argv[])
{
int result1 = 2;
int iArgvNum = 0;
BYTE Num = 0; char* lpFileName = (char*)malloc(MAX_PATH);
memset(lpFileName, 0, MAX_PATH); strlwr(argv[0]);
GetGlobalData(argv[0]); memset((char*)lpLogFileName, 0, MAX_PATH); strcpy(headLog.T_NAME, argv[0]);
memset(startTime, 0, LENGTHA);
tStartTime = getNowTime(startTime);
time(&tStartTime);
strcpy(headLog.T_STARTTIME, startTime); if (argc == 3)
{
strlwr(argv[2]);
if (strstr(argv[2], ".ini") == NULL)
{
PromptInformation(argv[0]);
return 1;
} iArgvNum = 1;
if (strcmpi(argv[iArgvNum], "all") == 0)
{
#ifdef DEBUG
printf("**argv[iArgvNum] = %s\n", argv[iArgvNum]);
#endif
iFCOMCurrentNum = iAllFCOMNum + 1;
}
else
{
#ifdef DEBUG
printf("*argv[iArgvNum] = %s\n", argv[iArgvNum]);
#endif
iFCOMCurrentNum = atoi(argv[iArgvNum]);
Num = iFCOMIndex[iFCOMCurrentNum];
if (iFCOMCurrentNum < 1 || iFCOMCurrentNum > iAllFCOMNum)
{
printf("Parameter number is out of range.\n");
PromptInformation(argv[0]);
return 1;
}
} iArgvNum = 2;
if (LogName(lpLogFileName, argv[iArgvNum]))
{
return 1;
} if ((argv[iArgvNum][0] == '.') || (argv[iArgvNum][1] == ':'))
{
sprintf((char*)lpFileName, "%s", argv[iArgvNum]); }
else
{
sprintf((char*)lpFileName, ".\\%s", argv[iArgvNum]); } result1 = FwComMain(lpFileName, cFCOMName, Num); }
else
{
PromptInformation(argv[0]);
return 1;
} return result1;
}

计算机COM口数据测试的更多相关文章

  1. U盘常见问题汇总

    优盘常见问题,持续更新.大家有什么问题可以留言,一起解决,谢谢. 1.优盘中的文件全部变成快捷方式解决办法 打开优盘,查找updat.vbs文件脚本,此文件脚本为病毒脚本,若找不到文件脚本则开启隐藏文 ...

  2. 手持PDA智能条码扫描RFID打印POS机

    手持PDA智能条码扫描RFID打印POS机   一.系统稳定性: 1.硬件稳定性: 采用了华为海思(国内唯一可以媲美全球顶级的CPU+射频方案厂商,可以和英伟达等一决高下)手机方案,CPU+射频浑然一 ...

  3. 思科ASA系列防火墙配置手册

    使用console连接线登录方法 1.使用cisco的console连接线,连接设备的console口和计算机com口(笔记本用USB转COM口连接线)2.使用超级终端或secureCRT软件连接设备 ...

  4. U盘详解

    摘要:U盘,称呼最早来源于朗科公司生产的一种新型存储设备,名曰“优盘”,使用USB接口进行连接.USB接口就连到电脑的主机后,U盘的资料可与电脑交换.而之后生产的类似技术的设备由于朗科已进行专利注册, ...

  5. U盘常见故障及检修

    一般U盘故障分为软故障和硬故障,其中以软故障最为常见.  软故障主要是指U盘有坏块,从而导致U盘能被计算机识别,但没有盘符出现,或者有盘符出现,但当打开U盘时却提示要进行格式化,而格式化又不能成功.前 ...

  6. ubuntu 中iptables

    ubuntu中启动及关闭iptables 在ubuntu中由于不存在 /etc/init.d/iptales文件,所以无法使用service等命令来启动iptables,需要用modprobe命令. ...

  7. ISO七层模型详解

    ISO七层模型详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我刚刚接触运维这个行业的时候,去面试时总是会做一些面试题,笔试题就是看一个运维工程师的专业技能的掌握情况,这个很 ...

  8. ubuntu iptables设置【转】

    root@qustdjx-K42JZ:/home/qustdjx# iptables -L -nChain INPUT (policy ACCEPT)target     prot opt sourc ...

  9. 一步步教你搭建TinyOS2.1.2开发环境

    (本教程使用的是VirtualBOX +ubuntu14.04+tinyos2.1.2) note:看了非常多的tinyos的安装教程.区别不是非常大,无非就是安装编译器配置环境等.尽管简单,但还是有 ...

  10. USB转串口连接线与串口调试助手的使用

    ---作者吴疆,未经允许,严禁转载,违权必究--- ---欢迎指正,需要源码和文件可站内私信联系--- -----------点击此处链接至博客园原文----------- 功能说明:宇泰UT-890 ...

随机推荐

  1. Seal AppManager发布:基于平台工程理念的全新应用部署管理体验

    4月12日,数澈软件Seal(以下简称"Seal")宣布推出新一代应用统一部署管理平台 Seal AppManager,采用平台工程的理念,降低基础设施操作的复杂度为研发和运维团队 ...

  2. 是时候,升级你的 Windows 了「GitHub 热点速览」

    不知道多少小伙伴用着 Windows 操作系统,可能会有一个烦恼是有时候操作系统过慢,因为众多拖慢 Windows 系统的组件.Atlas 作为一个修改版的 Windows 系统,能极大提高操作系统运 ...

  3. 工作中,Oracle常用函数

    目录 1.序言 2.Oracle函数分类 3.数值型函数 3.1 求绝对值函数 3.2 求余函数 3.3 判断数值正负函数 3.4 三角函数 3.5 返回以指定数值为准整数的函数 3.6 指数.对数函 ...

  4. pandas 常用操作记录

    apply函数 一个非常灵活的函数,能够对整个DataFrame或者Series执行给定函数的操作. 函数可以是自定义的,也可以是python或者pandas内置的函数,还可以是匿名函数. 作用: 用 ...

  5. docker安装kibana,报错Kibana server is not ready yet,未解决

    1.命令 docker run -d -e ELASTICSEARCH_URL=http://192.168.101.158:9200 -p 5601:5601 --name kibana kiban ...

  6. 2021-10-01:矩阵置零。给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。进阶:一个直观的解决方案是使用 O(mn) 的额外空间

    2021-10-01:矩阵置零.给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法.进阶:一个直观的解决方案是使用 O(mn) 的额外空间, ...

  7. 聊聊Seata分布式解决方案AT模式的实现原理

    什么是Seata分布式事务解决方案 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.为用户提供了AT.TCC.SAGA和XA事务模式,为用户打造一站式的分布式解决 ...

  8. POJ - 2251 地下城主

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

  9. pycham2022最新破解

    pycharm破解方式常见有2种: 1 .破解插件+激活码,一般激活到2099年或者2089年! 2 .破解插件.该破解插件可以无限重置30天,也就是pycharm永远有30天的试用期,永不到期!   ...

  10. C2简介

    C2简介 学习命令与控制的基本知识,帮助您成为更好的红队队员并简化您的下一次红队评估! thm:https://tryhackme.com/room/introtoc2 介绍 命令与控制 ( C2 ) ...