//////////////////////////////////////////////////////////////////
//==RS232实时通讯简例 2010-5-18 ==
//
// * 使用RTX实时平台
// * 避开W32系统,Ring0下直接控制UART寄存器
// * 创建两个Thread来进行收和发数据
// * NI PC16550D UART芯片
//
//***************************************************************
//
// PC Based 实时系统开发
// hongxin.he#gmail.com
/////////////////////////////////////////////////////////////////
#include "UART.h"
HANDLEhsm = NULL;
pSHAREDMEMORYpsm = NULL;
HANDLEhSendThread, hReceiveThread;
DWORDdwSendThreadID, dwReceiveThreadID;
BOOLbActive = FALSE;
intiPort=0;
DWORDSend_Data(LPVOID lpvThreadParm);
DWORDReceive_Data(LPVOID lpvThreadParm);
voidErrorExit(int error_code);
void _cdecl main(int argc, char *argv[])
{
intTimeOut= 0;
int iBaudRate= 0;
intiStopBit= 0;
int iDataLength = 0;
int iParity= 0;
if(argc != 2) ErrorExit(1);
++argv;
if((hsm = RtOpenSharedMemory(SHM_MAP_WRITE, FALSE, argv[0], &psm)) == NULL) //open shared memory
ErrorExit(2);
psm->bStop = FALSE;
psm->bSent = FALSE;
// create two thread to send and receive
hSendThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Send_Data,NULL, 0, &dwSendThreadID);
hReceiveThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Receive_Data,NULL, 0, &dwReceiveThreadID);
TimeOut = 100; //wait for connect signal
while((TimeOut-- >0)&&(psm->bConnectStart == FALSE))RtSleep(10);
if(TimeOut>0)
{
switch(psm->iPort)
{
case 0:
iPort = COM1_ADDR;
break;
case 1:
iPort = COM2_ADDR;
break;
case 2:
iPort = COM3_ADDR;
break;
case 3:
iPort = COM4_ADDR;
break;
default:
break;
}
switch(psm->iBaudRate)
{
case 0:
iBaudRate = 4800;
break;
case 1:
iBaudRate = 9600;
break;
case 2:
iBaudRate = 19200;
break;
default:
iBaudRate = 9600;
break;
}
//xxxx xx00 5bit
//xxxx xx01 6bit
//xxxx xx10 7bit
//xxxx xx11 8bit
iDataLength = psm->iDataLength;
switch(psm->iParity)
{
case 0: //PARITY OFFxxx0 0xxx
iParity = 0x00;
break;
case 1://PARITY ON ODDxxx0 1xxx
iParity = 0x08;
break;
case 2://PARITY ON EVENxxx1 1xxx
iParity = 0x18;
break;
default:
iParity = 0x00;
break;
}
switch(psm->iStopBit)
{
case 0://STOP BIT OFF xxxx x0xx
iStopBit = 0x00; //1 stop bit
break;
case 1:
iStopBit = 0x00; //data length=5bit, 1.5 stop bit
break;
case 2://STOP BIT ON xxxx x1xx
iStopBit = 0x04; //data length=6,7,8bit, 2 stop bit
break;
default:
iStopBit = 0x00; //1 stop bit
break;
}
psm->bConnectResult = ComPort_Init(iPort, iBaudRate, iDataLength, iStopBit, iParity);
while(psm->bStop == FALSE)RtSleep(2000);
}
RtSleep(500);
RtCloseHandle(hSendThread);
RtCloseHandle(hReceiveThread);
ExitProcess(0);
}
BOOL ComPort_Init(int com_port, int baud_rate, int data_length, int stop_bit, int parity_bit)
{
USHORT ivalue;
ivalue = RtReadPortUshort((PUSHORT)(com_port + INTERRUPT_ENABLE));
RtWritePortUshort((PUSHORT)(com_port + INTERRUPT_ENABLE), 0); //'0'enable received data available interrupt
//set DLAB = 1 divisor latch access bit
RtWritePortUshort((PUSHORT)(com_port + LINE_CONTROL), (USHORT)(RtReadPortUshort((PUSHORT)(com_port + LINE_CONTROL)) | DLAB));
//set baud rate
baud_rate = MAXBAUDRATE / baud_rate;
RtWritePortUshort((PUSHORT)(com_port + BAUD_RATE_LO), (USHORT)baud_rate);
//enable FIFO
RtWritePortUshort((PUSHORT)(com_port + FIFO_CONTROL), (USHORT)(FIFO_ENABLE + 0x80));
//set data bit, stop, parity_bit and set dlab = 0
RtWritePortUshort((PUSHORT)(com_port + LINE_CONTROL), (USHORT)(data_length + stop_bit + parity_bit));
//enable uart interrupt
RtWritePortUshort((PUSHORT)(com_port + INTERRUPT_ENABLE), (USHORT)ivalue);
//check com port read status
if(RtReadPortUshort((PUSHORT)(com_port + LINE_STATUS)) & 0x1e) //0001 1110 overrun/parity/framing error
{
RtReadPortUshort((PUSHORT)com_port);
return FALSE;
//printf("read error");
}
//set DTR on
RtWritePortUshort((PUSHORT)(com_port + MODEM_CONTROL), (USHORT)(RtReadPortUshort((PUSHORT)(com_port + MODEM_CONTROL))|0x01));
//set RTS on
RtWritePortUshort((PUSHORT)(com_port + MODEM_CONTROL), (USHORT)(RtReadPortUshort((PUSHORT)(com_port + MODEM_CONTROL))|0x02));
return TRUE;
}
void ErrorExit(int error_code)
{
if(error_code == 1)
printf("Use WinDemo.exe to run UART.rtss\n");
if(hsm)
RtCloseHandle(hsm);
ExitProcess(error_code);
}
DWORD Send_Data(LPVOID lpvThreadParm)
{
RtReadPortUchar((PUCHAR)iPort);
RtWritePortUshort((PUSHORT)iPort, (USHORT)'\x00');
while(1)
{
if((TXD_CHECK == ON)&&(psm->bSent == TRUE))
{
RtWritePortBufferUchar((PUCHAR)iPort, (PUCHAR)psm->sentBuffer, strlen(psm->sentBuffer));
psm->bSent = FALSE;
bActive = TRUE;
}
RtSleep(20);
}
}
DWORD Receive_Data(LPVOID lpvThreadParm)
{
int i=0;
int timeout=0;
while(1)
{
if((RXD_CHECK == ON)&&(bActive == TRUE))
{
RtSleep(20); //delay for data writing to buffer
memset(psm->receivedBuffer, 0, sizeof(psm->receivedBuffer));
for(i=0;i<sizeof(psm->receivedBuffer);i++)
{
timeout=5;
while((RXD_CHECK==OFF)&&(timeout-- > 0)) RtSleep(1);
if(timeout <= 0x00)
{
psm->receivedBuffer[i]=0x00;
break;
}
elsepsm->receivedBuffer[i] = RtReadPortUchar((PUCHAR)iPort);
}
psm->bReceived = TRUE;
bActive = FALSE;
psm->bSent = FALSE;
}
RtSleep(20);
}
}
RTX下串口驱动程序
5星 · 超过95%的资源 需积分: 22 36 浏览量
2018-06-05
16:35:12
上传
评论 2
收藏 3KB RAR 举报
xielxy
- 粉丝: 0
- 资源: 2
最新资源
- QuestionTwo.java
- QuestionOne.java
- OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).rar
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 南京邮电大学数学实验:熟练掌握 Matlab 软件的基本命令和操作
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 2017校招真题校园招聘真题算法题(37道)Python源码.zip
- 基于单片机protues仿真的多功能自动饮水机系统设计(仿真图、源代码、演示视频)
- 论文《一种修复流程挖掘事件日志中缺失活动标签的深度学习方法》翻译
- 智慧电厂相关资料发电控制的方式
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈