c语言写的计算机串口通信软件Word格式文档下载.docx
- 文档编号:4428145
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:28
- 大小:19.97KB
c语言写的计算机串口通信软件Word格式文档下载.docx
《c语言写的计算机串口通信软件Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《c语言写的计算机串口通信软件Word格式文档下载.docx(28页珍藏版)》请在冰点文库上搜索。
voidmain_menu(void);
voidinterruptcom_handler(void);
voidtrans(intc);
intreadchr(char*c);
voidtest_TX(void);
voidtest_RX(void);
unsignedshortCRC16(unsignedchar*message,unsignedshortdata_length);
intwait_chr(char*wc);
voidmanual_RTU(void);
voidrand_NOISE(void);
voidmanual(void);
voidbaud_rate(void);
voidINPUT(unsignedshortint*temp);
voidLoopBack_Test(void);
intlooptest1(void);
intlooptest2(void);
intloootest3(void);
voidabout(void);
voidmain(void)
{
intline,mask;
/*Commparameters*/
voidinterrupt(*old_handler)();
old_handler=getvect(IRQ+8);
/*OldISRadress*/
i_put=i_get=buffer;
/*Pointerinitialisation*/
memset(buffer,0,SIZE);
/*Bufferintialisation*/
baud=0x0c;
/*0x01=115200bps
0x02=57600bps
0x03=38400bps
0x06=19200bps
0x0c=9600bps*/
line=0x03;
/*8bits,nonparity,1stop*/
/*initialisation*/
outportb(COM+IER,0);
inportb(COM+LSR);
inportb(COM+MSR);
inportb(COM+IIR);
inportb(COM+RBR);
/*setspeed*/
outportb(COM+LCR,inportb(COM+LCR)|0x80);
outportb(COM+DLM,baud>
>
8);
outportb(COM+DLL,baud&
0xff);
outportb(COM+LCR,inportb(COM+LCR)&
0x7f);
/*setdataformat*/
outportb(COM+LCR,line);
outportb(COM+MCR,0x0b);
outportb(COM+IER,0x01);
/*setISRaddress*/
disable();
setvect(IRQ+8,com_handler);
enable();
mask=inportb(I8259M);
mask&
=~(1<
<
IRQ);
outportb(I8259M,mask);
/*clearthescreen*/
clrscr();
/*DisplayMainMenu*/
main_menu();
/*CloseSerialPort(COM1|COM2)*/
setvect(IRQ+8,old_handler);
mask|=(1<
/***********ENDOFFUNCTIONMAIN()**********/
}
voidmain_menu(void)
while
(1)
{
clrscr();
printf("
\n\nPC-BasedOscilloscopeTestProgram"
);
\n----------------------------------\n"
\nRXTerminal--hit1"
\nTXTerminal--hit2"
\nManualRTUframewithCRC--hit3"
\nManualRTUframenoCRC--hit4"
\nSimulateRandomNoise--hit5"
\nLoopbacktest--hit6"
\nChangeBaudRate--hit7"
\nAbout--hit8"
\nQuit--hitQ"
_loop1:
switch(getch())
{
case'
1'
:
test_RX();
break;
2'
test_TX();
3'
manual_RTU();
4'
manual();
5'
rand_NOISE();
6'
LoopBack_Test();
7'
baud_rate();
8'
about();
Q'
q'
return;
default:
goto_loop1;
}
}
voidinterruptcom_handler()
*i_put++=inportb(COM+RBR);
if(i_put==&
buffer[SIZE])i_put=buffer;
outportb(I8259,EOI);
voidtrans(intc)
while(!
(inportb(COM+LSR)&
0x20));
outportb(COM+THR,c);
intreadchr(char*c)
if(i_get==i_put)return(-1);
*c=*i_get++;
if(i_get==&
buffer[SIZE])i_get=buffer;
return(0);
voidtest_TX(void)
unsignedcharmessage[250];
intcount=0;
printf("
\n\nTXTerminal"
\n-----------"
\nTypeyourmessage,hit[ENTER]totransmit:
-\n\n"
/*FillMessageWith0xFF*/
memset(message,0xff,250);
gets(message);
//GetMessage
/*Print&
TransmitRS232COM1*/
\n\nSendingMessaging:
-\n"
while(count<
249&
&
message[count]!
=0xFF)
%c"
message[count]);
trans(message[count++]);
\n\nMessagesentsuccessfully."
test_RX();
//WaitforResponce
voidtest_RX(void)
unsignedcharch;
/*Displayinformationonscreen*/
\n\nRXTerminal"
\nWaitingformessage(pressakeytostop)\n"
/*LoopUntilKeyboardkeyishit*/
if(kbhit())
{
printf("
\nOperationAbortedbyUser!
!
\n"
return;
if((readchr(&
ch))==0)
ch);
/*FinishedRXTest-ReturnBacktoMainMenu*/
unsignedshortCRC16(unsignedchar*message,unsignedshortmessage_length)
unsignedshortCRC=0xFFFF,//CRCinitialisedwithall'
s
i,//LoopControl
temp;
//Tempforswap
while(message_length--)//Loopuntilallbytescalulated
CRC=CRC^(*message++);
for(i=0;
i++<
8;
)//Shiftall8-bits
if(CRC&
0x0001)CRC=(CRC>
1)^0xA001;
elseCRC>
=1;
temp=CRC&
0xFF;
//Tempstorageforswap
CRC=((CRC>
8)&
0xFF)+(temp<
//Swaphighamdlowbyte
return(CRC);
//Returncalulated16-bitCRC
intwait_chr(char*wc)
Delay:
Baud=9600,8-bits&
Start&
stop=10-bits
Theentiremessageframemustbetransmitted
asacontinuousstream.IFsilentformore
than1.5charactertime,therecevingdevice
flushesincompetemessage.
1.5X0.96=1.44msabout1.5ms
1.5ms(MaxGapbetweenCharacters)*/
chartimeout;
delay
(2);
//Delay1.5ms-MAXtimebetweencharacter'
if(readchr(wc)!
=0)
sound(70);
//Beepon
delay(100);
//Delay100ms
nosound();
//Beepoff
\n\n!
ErrorTimeout!
"
timeout=TRUE;
elsetimeout=FALSE;
returntimeout;
voidmanual_RTU(void)
unsignedcharRTU_frame[SIZE],//RTUFrame
CRC_HI,//HighbyteofCRC
CRC_LO;
//LowbyteofCRC
unsignedshortintcount=0,//Usedforloopcontrol
frame_length=0,//ThetotallengthofRTUframe
temp,//16-bittemp
CRC;
//16-bitCRC
\n\nManualRTUframewithaddedCRC"
\n---------------------------------"
\nEnterRTU_frameinbyte'
senter'
DF'
whenfinished"
count=0;
\nRTU_frame[%d](e.g01)="
count);
while(temp!
=0xDF)
Size_Temp=2;
INPUT(&
temp);
RTU_frame[count]=temp;
count++;
RTU_frame[%d](e.g01)="
count--;
/*CalulateCRCfortestmessage*/
CRC=CRC16(RTU_frame,count);
\nCalulatedCRC(Hex):
%X"
CRC);
/*Split16-bitCRCintohighandlowbytes*/
CRC_LO=CRC;
CRC_HI=CRC>
8;
/*AddCRCtoendofRTU*/
RTU_frame[count++]=CRC_HI;
RTU_frame[count]=CRC_LO;
frame_length=count;
\nTotalFrameLength(Dec):
%d"
frame_length+1);
/*ConstrunctingofRTUframeisnowcomplete*/
sendRTUframethroughRS232COM1*/
\n\nSendingRTUFrame(HEX):
=frame_length)
%X"
RTU_frame[count]);
trans(RTU_frame[count++]);
\n\nFinishedSendingRTUFrame"
i_get=i_put;
voidrand_NOISE(void)
unsignedshortinttemp;
//16-bittemp
\n\nSimulateRandomNoise"
\n-----------------------"
\nNodelaybetweenbytes--Hit1"
\nRandomdelay(0to100ms)betweembytes--hit2"
\nUsersetsdelayinmilliseconds--hit3"
\nCancel-ReturntoMainMenu--hit4"
switch(getch())
case'
\nSendingRandomnoise-delay=0(anykeytostop)"
while(!
kbhit())trans(rand()%0xff);
break;
\nSendingRandomnoise-delay=RAND(anykeytostop)"
kbhit())
{
delay(rand()%100);
trans(rand()%0xff);
}
\nDelay(ms)?
"
scanf("
%d"
&
printf("
SendingRandomnoise-delay=%dms(anykeytostop)"
temp);
delay(temp);
i_get=i_put;
/*ClearBuffer*/
voidmanual(void)
CRC_HI,//HighbyteofCRC
CRC_LO;
unsignedshortintcount=0,//Usedforloopcontrol
frame_length=0,//ThetotallengthofRTUframe
temp;
\n\nManualRTUframenoCRC"
\n-------------------------"
count=count-2;
voidbaud_rate(void)
intrate;
/*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 计算机 串口 通信 软件