⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialcomm.c

📁 这是实际项目中的一个串口通信程序. Makefile通过开关, 可使此程序适用于 Linux 和嵌入式 ARM Linux. 代码注释较多. 是学习UART或Serail Port 通信的一个好例子.
💻 C
字号:
// SerialComm.cpp : Defines the entry point for the DLL application.
//
//History
//*Data          *Name      *comments.
//2008-Feb-03    Rock Li    Initialization

//#include "stdafx.h"
#include "SerialComm.h"
#include "SerialBase.h"

// New Key word. It should be well-arranged in the future.

#define  CMD_DOWNLOAD_UID		0xEF   //DownloadUID
#define  CMD_RUN_NET_BUILD		0xEE   //RunNetBuild

#define  CMD_SEND_UNACK_DATA_TO_TN 0xD0   //  SendUnackDataToTN

#define  CMD_SEND_ACK_DATA_TO_TN   0xD1   //  SendAckDataToTN


#define  MAX_UID 8   //DownloadUID

#define UART_TIME_OUT 100

#define UART_ACKED_TIME_OUT 100

#define __LITTLE_ENDIAN_BITFIELD 1

#pragma pack(1)
typedef struct  
{
	unsigned char command;  //CMD_DOWN_0 EF
//	unsigned short dataLen;
	unsigned char dataLen[2];

}UartHead;  //head of Uart

typedef struct  
{
	UartHead head;
	unsigned char UID[MAX_UID][6];
}UartDownloadUID;  //UID download

typedef struct  
{
	UartHead head;
	unsigned char result;
	unsigned char data[1];
}UartResponsePackage;  //UID download


#pragma pack()


//Added by Rock 2008-Feb-01

#define MAX_NUM_TN 100;

typedef struct  
{
	unsigned char   uniqueNodeId[6];
}UID;


static unsigned char m_AckCmd[] = {
										CMD_DOWNLOAD_UID,
										CMD_RUN_NET_BUILD,
										CMD_SEND_UNACK_DATA_TO_TN,
										CMD_SEND_ACK_DATA_TO_TN
									}; //the name should be adjusted

int DownloadUID(unsigned char *p_TermUID, int NumOfNodes)
{
//CMD_DOWN_DOWNLOAD_UID
//To make the check sum
	
	if(NumOfNodes>MAX_UID)
	{
		return -1;
	}

	UartDownloadUID package;
	memset((void*)&package,0,sizeof(package));


	package.head.command = CMD_DOWNLOAD_UID;
	package.head.dataLen[0] = NumOfNodes * 6 ; 

	memcpy(package.UID,p_TermUID,NumOfNodes*6 );//+ 1 + 2 +2 ); 


	// 1-> functionID, 2-> Data Length,
	if(WriteComm((unsigned char*)&package, package.head.dataLen[0] +1 +2 ) != 0 ) //WE should check it again.
	{
		return -1;
	}

	pMsgQue ackMsg = NULL;

	int bRet = GetAckMessage(&ackMsg, UART_TIME_OUT);

	if(bRet == 0 && ackMsg != NULL)
	{
		UartResponsePackage*  responseMsg = (UartResponsePackage*)ackMsg;

		if(responseMsg->head.command == CMD_DOWNLOAD_UID
			&& responseMsg->result == 0x01)  
		{
			return 0;
		}
		else
		{
			//it is impossible; program error
			return -1;
		}
	}	
	else
	{
		return -1;
	}

	return 0;
}

int DllInit(char szComName[])
{
//bool Init(HANDLE hProExit, unsigned char uploadCmd[],char szComName[])

	return Init(m_AckCmd,szComName);

//	return 0;
}

int DllCleanUp()
{
	return CleanUp();
}

int RunNetBuild(void)
{
	UartDownloadUID package;
	memset((void*)&package,0,sizeof(package));

	package.head.command = CMD_RUN_NET_BUILD;
	package.head.dataLen[0] = 0x00; 

	// 1-> functionID, 2-> Data Length,
	if(WriteComm((unsigned char*)&package, package.head.dataLen[0] +1 +2 ) != 0) //WE should check it again.
	{
		return -1;
	}

	pMsgQue ackMsg = NULL;

	int bRet = GetAckMessage(&ackMsg,UART_TIME_OUT);

	if(bRet == 0 && ackMsg != NULL)
	{
			UartResponsePackage*  responseMsg = (UartResponsePackage*)ackMsg;

			if(responseMsg->head.command == CMD_RUN_NET_BUILD
				&& responseMsg->result == 0x01)  //this command should be adjusted.
			{
				return 0;
			}
			else
			{
				//it is impossible; program error
				return -1;
			}
		
	}
	else
	{
		return -1;
	}

	return 0;
}

//Purpose: To sends unacknowledged data to a TN. 
//Arguments description:
//p_TermUID --> An pointer to UID of one terminal Node
//p_InDataBuf -->An pointer to the Data to be sent
//inDataLen -->the length of the data
//return value: true for success and false for failure  
//comments: inDataLen should be less than 200. Or it will return false.

int SendUnAckDataToTN ( unsigned char *p_TermUID,
										unsigned char *p_InDataBuf,
										unsigned char  inDataLen)
{
#pragma pack(1)
	struct tag_UserData
	{
		UartHead head;
		unsigned char data[256];
	} ;
#pragma pack()

	struct tag_UserData DataPackage;

	if(inDataLen >200)
	{
		return -1;
	}

////////////////
	memset((void*)&DataPackage,0,sizeof(DataPackage));

	DataPackage.head.command = CMD_SEND_UNACK_DATA_TO_TN;

	DataPackage.head.dataLen[0] = inDataLen +6 ;   //a UID is 6 Bytes.

	memcpy((unsigned char*)DataPackage.data, p_TermUID, 6);//a UID is 6 Bytes.

	memcpy( (unsigned char*)DataPackage.data  +6 ,p_InDataBuf,inDataLen); //skip a UID 

	// 1-> functionID, 2-> Data Length,
	if(WriteComm((unsigned char*)&DataPackage, DataPackage.head.dataLen[0] +1 +2 ) != 0) 
	{
		return -1;
	}

	pMsgQue ackMsg = NULL;

	int bRet = GetAckMessage(&ackMsg, UART_ACKED_TIME_OUT);


	if(bRet == 0 && ackMsg != NULL)
	{
			UartResponsePackage*  responseMsg = (UartResponsePackage*)ackMsg;

			if(responseMsg->head.command == CMD_SEND_UNACK_DATA_TO_TN
				&& responseMsg->result == 0x01)
			{
				return 0;

			}
			else
			{
				//it is impossible; program error
				return -1;
			}

	}
	else
	{
		return -1;
	}

	return 0;
}

//Purpose: To sends unacknowledged data to a TN. 
//Arguments description:
//p_TermUID --> An pointer to UID of one terminal Node
//p_InDataBuf -->An pointer to the Data to be sent
//inDataLen -->the length of the data
//return value: true for success and false for failure  
//comments: inDataLen should be less than 200. Or it will return false.

int SendAckDataToTN ( unsigned char    *p_TermUID,
										unsigned char  *p_InDataBuf,
										unsigned char  inDataLen,
										unsigned char  *p_RespData,
										unsigned char  *p_RespDataLen)
{

	#pragma pack(1)
	struct tag_UserData
	{
		UartHead head;
		unsigned char data[256];
	} ;
#pragma pack()

	struct tag_UserData DataPackage;

	if(inDataLen >200)
	{
		return -1;
	}

////////////////
	p_RespData = NULL;
	*p_RespDataLen = 0;

	memset((void*)&DataPackage,0,sizeof(DataPackage));

	DataPackage.head.command = CMD_SEND_ACK_DATA_TO_TN;

	DataPackage.head.dataLen[0] = inDataLen +6 ;   //a UID is 6 Bytes.

	memcpy(&DataPackage.data, p_TermUID, 6);//a UID is 6 Bytes.

	memcpy( (unsigned char*)DataPackage.data  +6 ,p_InDataBuf ,inDataLen); //skip a UID 

	// 1-> functionID, 2-> Data Length,
	if(WriteComm((unsigned char*)&DataPackage, DataPackage.head.dataLen[0] +1 +2 ) != 0) //WE should check it again.
	{
		return -1;
	}

	pMsgQue ackMsg = NULL;

	int bRet = GetAckMessage(&ackMsg, UART_TIME_OUT);

	if(bRet == 0 && ackMsg != NULL)
	{
			UartResponsePackage*  responseMsg = (UartResponsePackage*)ackMsg;

			if(responseMsg->head.command == CMD_SEND_ACK_DATA_TO_TN
				&& responseMsg->result == 0x01)
			{
				return 0;

			}
			else
			{
				//it is impossible; program error
				return -1;
			}

	}
	else
	{
		return -1;
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -