如何将字符串CBR_115200转换成相应的cardinal值,正确的赋给DCB中的baudrate参数?

Storm2008 2009-02-19 07:42:50
如何将字符串CBR_115200转换成相应的cardinal值,正确的赋给DCB中的baudrate参数?

将串口的配置参数保存到ini文件中了,读出来的BaudRade参数是字符串类型的,想不出来应该怎样正确的赋给BaudRade了。

...全文
404 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Storm2008 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 starluck 的回复:]
呵呵,僵哥是很强。我啊,只是简单的还行。
[/Quote]

kiven
这个名字看的好熟悉,电子书库是你写的吗?
Storm2008 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 starluck 的回复:]
呵呵,僵哥是很强。我啊,只是简单的还行。
[/Quote]

kiven
这个名字看的好熟悉,电子书库是你写的吗?
starluck 2009-02-19
  • 打赏
  • 举报
回复
呵呵,僵哥是很强。我啊,只是简单的还行。
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
看两位的回答总可以学到一些东西~

有两位在真是D版的幸运!
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 unsigned 的回复:]
INIFile code[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

[/Quote]


我想我应该是明白了

unsigned, starluck两位辛苦了,这么晚了,还在回答问题。
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 unsigned 的回复:]
象INI当中是配置的文字,最好还是继续通过配置转换过来.
[/Quote]


其实自己也知道转换,只是很少写程序,不会写转换的过程,所以才有此一问。
像这个
ONE5STOPBITS
1

我现在能想到的还是将字符串ONE5STOPBITS和Cardinal值1建立对应关系的笨方法。就是怎样建立这两个量之间的关系居然还有点发懵。
郁闷
有时间再找两本基础的书看看

僵哥 2009-02-19
  • 打赏
  • 举报
回复
[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]
僵哥 2009-02-19
  • 打赏
  • 举报
回复
象INI当中是配置的文字,最好还是继续通过配置转换过来.
starluck 2009-02-19
  • 打赏
  • 举报
回复
CBR_256000 用这个常量Delphi 的 windows 单元里找。DCB的参数的值在WINDOWS里都有定义的。
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 starluck 的回复:]
Delphi(Pascal) code


{ 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 C…
[/Quote]


3Q, 太好了~
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 starluck 的回复:]
Delphi(Pascal) code

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')........
);




这样吧,做个对应关系吧。如果你一定要用那种方式存储
[/Quote]


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

starluck 2009-02-19
  • 打赏
  • 举报
回复



{ 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}



就这个几个。
starluck 2009-02-19
  • 打赏
  • 举报
回复


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')........
);


这样吧,做个对应关系吧。如果你一定要用那种方式存储
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 unsigned 的回复:]
看看这个就大概明白了.所有选项都可以通过INI配置来完成转换.
http://msdn.microsoft.com/en-us/library/aa363214(VS.85).aspx
[/Quote]

CBR_600
600


CBR_57600
57600



NOPARITY
0


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

僵哥 2009-02-19
  • 打赏
  • 举报
回复
看看这个就大概明白了.所有选项都可以通过INI配置来完成转换.
http://msdn.microsoft.com/en-us/library/aa363214(VS.85).aspx
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
  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相应的参数。




僵哥 2009-02-19
  • 打赏
  • 举报
回复
你也可以在配置文件当中再配置一个
[code=INIFile][BoundRate]
CBR_115200=115200[/code]
僵哥 2009-02-19
  • 打赏
  • 举报
回复
你也可以在配置文件当中再配置一个
[code=INIFile][BoundRate]
CBR_115200=115200[/code]
僵哥 2009-02-19
  • 打赏
  • 举报
回复
这个应该就是Bound Rate为115200

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧