简单的说,可以用mscomm控件,或者用CreateFile/ReadFile/WriteFile,另外现在有一个Serial类专用于Windows下的串口编程。

解决方案 »

  1.   

    还有就是通过最底层的函数如:_outp,_inp,直接操作端口。注意串口的地址以及各寄存器的地址就可以了,最好看看微机原理这本书。
      

  2.   

    串口抽象成文件,进行针对文件句炳的I/O操作。
    1、hCom = CreateFile("COM1",...);
    2、ReadFile(hCom,...)/WriteFile(hCom,...);
    3、CloseHandle(hCom);
    以前有很多这方面的帖子。
      

  3.   

    你好,我正好也在开始这方面的编程学习,很希望能跟你一起探讨
    我觉得写串口程序的基本步骤可以这样:
    1。定义句柄:
    HANDLE hCommDev;
    hCommDev=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,
    0,NULL,OPEN_EXISTING,0,NULL);
    2。设置串口参数:
    DCB dcb;
    BuildCommDCB("COM2:1200,n,8,1",&dcb);//修改dcb值
    SetCommState(hCommDev,&dcb);//重新配置串口
    3。设置超时参数:
    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
    CommTimeOuts.ReadTotalTimeoutMultiplier=0;
    CommTimeOuts.ReadTotalTimeoutConstant=0;
    CommTimeOuts.WriteTotalTimeoutMultiplier=0;
    CommTimeOuts.WriteTotalTimeoutConstant=1000;
    SetCommTimeouts(hCommDev,&CommTimeOuts);
    4。清收发缓冲区:
    PurgeComm(hCommDev,PURGE_TXCLEAR);//清发送缓冲区
    PurgeComm(hCommDev,PURGE_RXCLEAR);//清接收缓冲区
    5。可以进行读写操作了
    读:
    char strCommRecvMsg[51];//存放读取到的数据
    DWORD dwBytesRead;//存放所读取到数据的字节数目,
    BOOL bReturn=ReadFile(hCommDev,strCommRecvMsg,50,
    &dwBytesRead,NULL);
    if(!bReturn) //失败返回
    return;
    if(dwBytesRead<1) //无数据返回
    return;
    可以将strCommRecvMsg[51]的有效部分拷贝到你想存放的地方写:
    DWORD dwBytesWritten;//存放实际写进去的字节数目
    char strmsg[]=“this is a test";
    WriteFile(hCommDev,&strmsg,14,&dwBytesWritten,NULL);
    这是最基本的过程,等到熟练以后就可以进行更深入的编程了。
      

  4.   

    用控件来完成比较好,而且功能也不比api完成的要差
      

  5.   

    用C语言编写简单的接口程序
    在通信中,为了保证运行安全可靠,标准的串行口必须具有许多握手信号和状态信息。这是因为通信的各个计算机CPU速度不一样(这会导致?错帧敚?以及发送机发送数据速度比接收机接 收速度快(这会导致?过冲敚?为解决这个问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位)的数据,而另外半个字节(高4位)则用来传送信息。我们可以对信息位(高4位)进行如下简单的编码: 
    0H: 发送的是新的半个字节数据 
    1H: 重新发送上次传送错误的数据 
    2H: 文件名结束 
    3H: 文件结束 
    这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就是发送机发送过来的那个字节。发送机接收到回送信号后,把它与刚发送的字节相比较,如果相同,就发送新的半个字节,否则就重新发送。新数据与旧数据通过信息位来区分。下面就是我用C语言编写控制串行口的程序。以一个发送文件的程序为例,介绍一下用C语言实现对接口的 控制。 
    源 程 序 为: 
     #include “dos.h"
     #include “stdlib.h"
     #include “stdio.h" #define PORT 0void SendFile(char fname); 
    / * 发 送 文 件 */
    void Send(int s);  
    / * 发 送 一 个 字 节 */
    void SendFileName(char fname);
    / * 发 送 文 件 名 */
    void ReceiveFile();
     / * 接 收 文 件 */
    void GetFileName(char f);
    / * 接 收 文 件 名 */
    void InitPort(int port,unsigned char para); 
    / * 初 始 化 端 口 */
    void SendPort(int port,char c);
     / * 端 口 发 送 */
    int ReadPort(int port);
     / * 读 端 口 字 节 */
    int CheckState(int port); 
    / * 检 查 端 口 状 态 */
    int Receive(int port,int G); 
    / * 接 收 一 个 字 节 */main(argc,argv)
       int argc;
       char *argv[];
    {
       if(argc<2){                                  
          printf(“Please input R(receive) 
                  or S(sent) parametre:");
          exit(1);
       }
       InitPort(PORT,231);
       if(argv[1]==‘S') 
    / * 检 查 选 择 的 有 效 性 */
          SendFile(argv[2]);
       else if(argv[1]==‘R')
          ReceiveFile();
       else{
          printf(“Error parament.Please input again.");
          exit(1);
       }
    }void SendFile(fname)
       char *fname;
    {
       FILE *fp;
       int ch,s;
       if(!(fp=fopen(fname,“rb"))){
          printf(“Can't open the file.\n");
          exit(1);
       }
       SendFileName(fname);
       do{
         ch=(int)getc(fp);
         if(ferror(fp)){
           printf(“Error reading file.\n");
           break;
         }
         s=ch %16;
     / * 取 文 件 中 一 个 字 节 的 低4 位 */
         Send(s);
       s=ch/16;  
    / * 取 文 件 中 一 个 字 节 的 高4 位 */
         Send(s);
       }while(!feof(fp));
       s=46; / * 发 送 文 件 结 束 信 息 */
       Send(s);
       Send(s);
       fclose(fp);
    }void Send(s)
       int s;
    {
       int G;
       SendPort(PORT,s);
       G=ReadPort(PORT); / * 等 待 握 手 信 号 */
       if(s!=G)
          s=s +16;
       do{
          SendPort(PORT,s);
          G=ReadPort(PORT); / * 等 待 握 手 信 号 */
       }while(s!=G);
    }void SendFileName(fname)
       char *fname;
    {
       int s,ch;
       printf(“Now transmit the file.Please wait...");
       while( *fname){
          ch=(int)fname + +;
          s=ch %16;
    / * 取 文 件 名 中 一 个 字 节 的 低4 位 */
          Send(s);
          s=ch/16;
          Send(s); 
    / * 取 文 件 名 中 一 个 字 节 的 低4 位 */
       }
       s=32;/ * 发 送 文 件 名 结 束 标 志 */
       Send(s);
       Send(s);
    }void ReceiveFile(){
       FILE *fp;
       char ch;
       int G1,G2,G3;
       char fname[15];
       GetFileName(fname);
       printf(“Receiving file %s.\n",fname);
       remove(fname);
       if(!(fp=fopen(fname,“wb"))){
          printf(“Can't open output file.\n");
          exit(1);
       }/*循环为检测每次接受的数据是否为新数据,如果不是,则用此次接收的数据覆盖上次接收的数据*/    G1=ReadPort(PORT);                 
       G2=Receive(PORT, &G1);
       do{                         
          G3=Receive(PORT, &G2);
          ch=(char)(G1 %16 +G2 *16);
    / * 恢 复 分 开 的 数 据,
         组 合 高4 位 和 低4 位 */                                                              
          putc(ch,fp);
          if(ferror(fp)){
            printf(“\nError writing file.");
            exit(1);
          }
          G2=Receive(PORT, &G3);
          G1=G3;
       }while(G1/16!=48);
       printf(“\nTransmit finished.");
       fclose(fp);
    }int Receive(port,G)
       int port, *G;
    {
       int GM;
       SendPort(port, *G);
       GM=ReadPort(port);
       if(GM/16==0)
          return GM;
       else if(GM/16==1){
          do{
           *G=GM;
           SendPort(port,GM);
           GM=ReadPort(port);
          }while(GM/16==1);
       }
       return GM;
    }void GetFileName(f)
       char *f;
    {
       int G1,G2,G3;
       char ch;
       G1=ReadPort(PORT);
       G2=ReadPort(PORT);
       do{
          G3=Receive(PORT, &G3);
          ch=(char)(G1 %16 +G2/16);
          *f=ch;
          *f + +;
          G2=Receive(PORT, &G3);
          G1=G3;
       }while(G1/16!=32);
       printf(“File name transmit finished.\n");
    }void InitPort(port,para)
       int port;
       unsigned char para;
    {
       union REGS reg;
       reg.x.dx=port;
       reg.h.ah=0;
       reg.h.al=para;
       int86(0x14, &reg, &reg);
    }void SendPort(port,c)
       int port;
       char c;
    {
       union REGS reg;
       reg.x.dx=port;
       reg.h.al=c;
       reg.h.ah=1;
       int86(0x14, &reg, &reg);
       if(reg.h.ah &128){
          printf(“\nSend mistakes!");
          exit(1);
       }
    }int ReadPort(port)
       int port;
    {
       union REGS reg;
       while(!(CheckState(port) &256)){
          if(kbhit()){ / * 如 端 口 长 期
                    无 数 据 可 人 为 终 止 等 待 */
           printf(“Press any key to exit.");
           getch();
           exit(1);
          }
       }
       reg.x.dx=port;
       reg.h.ah=2;
       int86(0x14, &reg, &reg);
       if(reg.h.ah &128){
          printf(“\nRead mistake!");
          exit(1);
       }
       return reg.h.al;
    }int CheckState(port)
       int port;
    {
       union REGS reg;
       reg.x.dx=port;
       reg.h.ah=3;
       int86(0x14, &reg, &reg);
       return reg.x.ax;
    }