用VC++6.0实现PC机与单片机之间的数据交换
appedWrite, dwBytesWritten, FALSE); m_OverlappedWrite. Offset += dwBytesWritten; } dwBytesWritten++; } } 1.2 接收例程 DCB ComDcb; //设备控制块 HANDLE hCom; //global handle hCom = CreateFile ("COM1",GENERIC_READ| GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hCom==INVALID_HANDLE_VALUE) { AfxMessageBox("无法打开串行口"); } else { COMMTIMEOUTS CommTimeOuts ; SetCommMask(hCom, EV_RXCHAR ) ; SetupComm(hCom, 4096, 4096 ) ; /*设置收发缓冲区 尺寸为4K */ PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR ) ; //清收发缓冲区 //以下初始化结构变量CommTimeOuts, 设置超时参数 CommTimeOuts.ReadIntervalTimeout = 0×FFFFFFFF ; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 4000; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 4000; SetCommTimeouts(hCom, CommTimeOuts ); //设置超时参数 ComDcb.DCBlength = sizeof( DCB ); GetCommState( hCom, ComDcb ); //获取当前参数 ComDcb.BaudRate =9600; //波特率 ComDcb.ByteSize = 8; //数据位 ComDcb.Parity = 0; /*校验 0~4=no, odd, even, mark, space */ SetCommState(hCom, ComDcb ) ; } //设置新的通信参数 接收可用定时器或线程等 DWORD dRead,dReadNum; unsigned char buff [200]; dRead=ReadFile(hCom, buff, 100, dReadNum, NULL); //接收100个字符, //dReadNum为实际接收字节数 2 利用端口函数直接操作 这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为: int _inp(unsigned shot port) 该函数从端口读取一个字节,端口号为0~65535。 写端口的函数原型为: int _outp(unsigned shot port, int databyte) 该函数向指定端口写入一个字节。 不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,由于涉及具体的硬件电路讨论比较复杂,在此不加赘述。 3 MSComm控件 MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。下面详细说明该类应用方法。 3.1 MSComm控件的属性 CommPort:设置串口号,类型 short :1-comm1 2-comm2. Settings:设置串口通信参数,类型 CString :B波特率,P奇偶性(N无校验,E偶校验,O奇校验),D字节有效位数,S停止位。 PortOpen:设置或返回串口状态,类型 BOOL:TURE打开,FALSE关闭。 InputMode:设置从接收缓冲区读取数据的格式,类型 long: 0-Text 1-Bin。 Input:从接收缓冲区读取数据,类型 VARIANT。 InBufferCount:接收缓冲区中的字节数,类型:short。 InBufferSize:接收缓冲区的大小,类型:short。 Output:向发送缓冲区写入数据,类型:VARIANT。 OutBufferCount:发送缓冲区中的字节数,类型:short。 OutBufferSize:发送缓冲区的大小,类型:short。 InputLen:设置或返回Input读出的字节数,类型:short。 CommEvent:串口事件,类型:short。 3.2 程序示例 串口初始化 if (!m_comm.GetPortOpen())m_comm.SetPortOpen(TURE); /*打开串口*/ m_comm.SetSettings("4800,n,8,1"); /*串口参数设置*/ m_comm.SetInputMode(0); /*设置TEXT缓冲区输入方式*/ m_comm.SetRthresHold(1); /*每接收一个字符则激发OnComm()事件*/ 接收数据 m_comm.SetInputLen(1); /*每次读取一个字符 VARINAT V1=m_comm.GetInput(); /*读入字符*/ m_V1=V1.bstrval; 发送字符 m_comm.SetOutput(Colevariant ("Hello"); /*发送 “Hello” */ 3.3 注意 SetOutput方法可以传输文本数据或二进制数据。用SetOutput方法传输文本数据,必须定义一个包含一个字符串的Variant。发送二进制数据,必须传递一个包含字节数组的Variant 到 Output 属性。正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等的数据,要以二进制形式发送。此处望引起读者注意,笔者曾经在此犯错。 4 VC++类CSerial 4.1 串行通信类CSerial简介 Cserial 是由MuMega Technologies公司提供的一个免费的VC++类,可方便地实现串行通信。以下为该类定义的说明部分。 class CSerial { public: CSerial(); ~CSerial(); BOOL Open( int nPort = 2, int nBaud = 9600 ); BOOL Close( void ); int ReadData( void *, int ); int SendData( cons
- RedHatLinux新手入门教程(11-12)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- 基于s3c2410的CramFS根文件系统的移植(07-13)
- 基于MPC8250的嵌入式Linux系统开发(07-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现(11-06)