当前位置:文档之家› c语言串口通信范例

c语言串口通信范例

一个c语言的串口通信程序范例
分类:技术笔记
标签:
c语言
串口通信
通信程序
it
最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着
#define COM232? 0x2f8
#define COMINT? 0x0b
#define MaxBufLen????? 500
#define Port8259?????? 0x20
#define EofInt??????? 0x20
static int? comportaddr;
static char intvectnum;
static unsigned char maskb;
static unsigned char Buffer[MaxBufLen];
static int? CharsInBuf,CircIn,CircOut;
static void (interrupt far *OldAsyncInt)();
static void interrupt far AsyncInt(void);
void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, ?????? unsigned char Data, unsigned char Stop, unsigned char Parity) {
?unsigned char High,Low;
?int f;
?comportaddr=ComPortAddr;
?intvectnum=IntVectNum;
?CharsInBuf=0;CircIn=0;CircOut=0; ?
?f=(Baud/100);
?f=1152/f; High=f/256;
?Low=f-High*256;
?outp(ComPortAddr+3,0x80);
?outp(ComPortAddr,Low);
?outp(ComPortAddr+1,High);
?
?Data=(Data-5)|((Stop-1)*4);
?if(Parity==2) Data=Data|0x18;
?else if(Parity==1) Data=Data|0x8; ?outp(ComPortAddr+3,Data);
?
?outp(ComPortAddr+4,0x0a);
?
?outp(ComPortAddr+1,0x01);
?
?disable();
?OldAsyncInt=getvect( IntVectNum );
?setvect( IntVectNum, AsyncInt );
?enable();
?
?maskb=inp(Port8259+1);
?if(IntVectNum==0x0c)outp(Port8259+1,maskb&0xef); ?else outp(Port8259+1,maskb&0xf7);?????????????? }
static void interrupt far AsyncInt(void)
{
?disable();
?if(CharsInBuf<MaxBufLen)
? Buffer[CircIn]=inp(comportaddr);
?if(CircIn<MaxBufLen-1) CircIn++;
?else CircIn=0;
?if(CircIn==CircOut) CircOut++;
?else CharsInBuf++;
?enable();
?outp(Port8259,EofInt);
}
void Restore(void)
{
?setvect(intvectnum,OldAsyncInt);
?outp(Port8259+1,maskb);?
}
int GetCharInBuf(unsigned char *Char)
{
?int Flag;
?Flag=-1;
?if(CharsInBuf>0)
? {
?? (*Char)=Buffer[CircOut];
?? if(CircOut<MaxBufLen-1)CircOut++;
?? else CircOut=0;
?? CharsInBuf--;
?? Flag=0;
? }
?? return Flag;
}
int SendChar(unsigned char Char)
{
?if((inp(comportaddr+5)&0x20)==0) return -1; ?outp(comportaddr,Char);
?return 0;
}
main()
{
?int i,c;
?unsigned char InChar;
?Init_COM(COM232,COMINT,1200,8,1,0);
?while(1)
? {
?? if(kbhit())
???? {if((InChar=getch())==27)break;
????? else while(SendChar(InChar));
???? }
?? if(GetCharInBuf(&InChar)==0)?
????? printf("%c",InChar);
?}
Restore();
}
下面介绍最重要的MFC:
CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。

CDocument 文档,负责内存数据与磁盘的交互。

最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)
CView视图,负责内存数据与用户的交互。

包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。

最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。

另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。

CDialog对话框
CWinApp应用程序类。

似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。

最常用函数InitInstance():初始化。

CGdiObject及子类,用于向设备文本画图。

它们都需要在使用前选进DC。

CPen笔,画线
CBrush刷子,填充
CFont字体,控制文字输出的字体
CBitmap位图
CPalette调色板
CRgn区域,指定一块区域可以用于做特殊处理。

CFile文件。

最重要的不外是Open(打开),Read(读入),Write(写)CString字符串。

封装了C中的字符数组,非常实用。

CPoint点,就是(x,y)对
CRect矩形,就是(left,top,right,bottom)
CSize大小,就是(cx,cy)对(宽、高)。

相关主题