如何将字符串CBR_115200转换成相应的cardinal值,正确的赋给DCB中的baudrate参数?将串口的配置参数保存到ini文件中了,读出来的BaudRade参数是字符串类型的,想不出来应该怎样正确的赋给BaudRade了。

解决方案 »

  1.   

    这个应该就是Bound Rate为115200
      

  2.   

    你也可以在配置文件当中再配置一个
    [code=INIFile][BoundRate]
    CBR_115200=115200[/code]
      

  3.   

    你也可以在配置文件当中再配置一个
    [code=INIFile][BoundRate]
    CBR_115200=115200[/code]
      

  4.   

      scOptions = Record
        sPort : String;
        BaudRate : String;
        ByteSize : String;
        Parity   : String;
        StopBits : String;
      end;
    function OpenScPort(const scOpt : scOptions) : THandle;
    var
      cc : TCOMMCONFIG;
      sTemp : String;
    begin  Result := CreateFile(PChar(scOpt.sPort),
                           GENERIC_READ or GENERIC_WRITE,
                           0, {not shared}
                           nil,
                           OPEN_EXISTING,
                           0, {FILE_ATTRIBUTE_NORMAL}
                           0 );  if Result = INVALID_HANDLE_VALUE then
        begin
          sTemp := #10#13 + '无法打开'+ scOpt.sPort + '端口,请确认'+ scOpt.sPort
                   + '端口存在,并且没有被其他程序占用!';
          MessageBox(Application.Handle, PChar(sTemp), '提示', MB_OK+MB_ICONWARNING+MB_APPLMODAL);
          Exit;
        end;
      GetCommState(Result, cc.dcb);
      cc.dcb.BaudRate := Cardinal(scOpt.BaudRate); //-----//
      cc.dcb.ByteSize := StrToInt(scOpt.ByteSize);
      cc.dcb.Parity := Cardinal(scOpt.Parity);
      cc.dcb.StopBits := Cardinal(scOpt.StopBits);

      showmessage(inttostr(cc.dcb.StopBits));   //-----//  if not SetCommState(Result, cc.dcb) then
        begin
          sTemp := #10#13 + '设置'+ scOpt.sPort + '端口参数过程中发生错误,程序将无法使用'
                   + scOpt.sPort + '端口!';
          MessageBox(Application.Handle, PChar(sTemp), '提示', MB_OK+MB_ICONWARNING+MB_APPLMODAL);
          Exit;
        end;  PurgeComm(Result,PURGE_RXCLEAR);end;ini文件内容
    [scPulse]
    sPort=COM1
    BaudRate=CBR_115200
    ByteSize=8
    Parity=NOPARITY
    StopBits=ONESTOPBIT
    我将这五个个参数读到scOpt中,如何正确的赋给DCB相应的参数。
      

  5.   

    看看这个就大概明白了.所有选项都可以通过INI配置来完成转换.
    http://msdn.microsoft.com/en-us/library/aa363214(VS.85).aspx
      

  6.   


    CBR_600
    600
    CBR_57600
    57600NOPARITY
    0
    多谢~~我在单位试了足有20分钟
    单位不让上网,查的是MSDN2001的,好像上面没列出来不同的字符串对应的Cardinal值。
    你给的网页上给了,我在试试,应该可以了。
      

  7.   

    type
      BaudRateStr = record
        RateInt  : Cardinal;
        rateStr  : String;
    end;
    const
      DCB_BaudRates : array[0..15] of BaudRateStr =    ( (RateInt : 0;       RateStr : '0'),
          (RateInt : CBR_110; RateStr : 'CBR_300'),
          (RateInt : CBR_600; RateStr : 'CBR_1200')........
        );
     这样吧,做个对应关系吧。如果你一定要用那种方式存储
      

  8.   


      { Baud rates at which the communication device operates }  CBR_110 = 110;
      {$EXTERNALSYM CBR_110}
      CBR_300 = 300;
      {$EXTERNALSYM CBR_300}
      CBR_600 = 600;
      {$EXTERNALSYM CBR_600}
      CBR_1200 = 1200;
      {$EXTERNALSYM CBR_1200}
      CBR_2400 = 2400;
      {$EXTERNALSYM CBR_2400}
      CBR_4800 = 4800;
      {$EXTERNALSYM CBR_4800}
      CBR_9600 = 9600;
      {$EXTERNALSYM CBR_9600}
      CBR_14400 = 14400;
      {$EXTERNALSYM CBR_14400}
      CBR_19200 = 19200;
      {$EXTERNALSYM CBR_19200}
      CBR_38400 = 38400;
      {$EXTERNALSYM CBR_38400}
      CBR_56000 = 56000;
      {$EXTERNALSYM CBR_56000}
      CBR_57600 = 57600;
      {$EXTERNALSYM CBR_57600}
      CBR_115200 = $1C200;
      {$EXTERNALSYM CBR_115200}
      CBR_128000 = $1F400;
      {$EXTERNALSYM CBR_128000}
      CBR_256000 = $3E800;
      {$EXTERNALSYM CBR_256000} 就这个几个。
      

  9.   

    我是第一次做这个,需要给个设置界面,可以设置这些参数,最直观的想法,就是直接把这些参数显示出来,并且保存到ini文件中。
    我也不知道怎样做才更好。
      

  10.   

    CBR_256000  用这个常量Delphi 的 windows 单元里找。DCB的参数的值在WINDOWS里都有定义的。
      

  11.   

    象INI当中是配置的文字,最好还是继续通过配置转换过来.
      

  12.   

    [code=INIFile][scPulse]
    sPort=COM1
    BaudRate=CBR_115200
    ByteSize=8
    Parity=NOPARITY
    StopBits=ONESTOPBIT[BaudRate]
    CBR_110=110
    CBR_300=300
    CBR_600=600
    CBR_1200=1200
    CBR_2400=2400
    CBR_4800=4800
    CBR_9600=9600
    CBR_14400=14400
    CBR_19200=19200
    CBR_38400=38400
    CBR_56000=56000
    CBR_57600=57600
    CBR_115200=$1C200
    CBR_128000=$1F400
    CBR_256000=$3E800[Parity]
    NOPARITY=0
    ODDPARITY=1
    EVENPARITY=2
    MARKPARITY=3
    SPACEPARITY=4[StopBits]
    ONESTOPBIT=0
    ONE5STOPBITS=1
    TWOSTOPBITS=2[/code]
      

  13.   

    其实自己也知道转换,只是很少写程序,不会写转换的过程,所以才有此一问。
    像这个
    ONE5STOPBITS
    1我现在能想到的还是将字符串ONE5STOPBITS和Cardinal值1建立对应关系的笨方法。就是怎样建立这两个量之间的关系居然还有点发懵。
    郁闷
    有时间再找两本基础的书看看
      

  14.   

    我想我应该是明白了unsigned, starluck两位辛苦了,这么晚了,还在回答问题。
      

  15.   


    kiven
    这个名字看的好熟悉,电子书库是你写的吗?
      

  16.   


    kiven
    这个名字看的好熟悉,电子书库是你写的吗?