调试VB *** 作USB串口多次失败后,重启一下机器

调试VB *** 作USB串口多次失败后,重启一下机器,第1张

概述多次调试后,即使退出VB IDE也不能完全初始化USB串口,有时候看起来有数据,但是不准确,重启一下OK.     API 文本查看器为 MAXDWORD 常量提供了不正确的值。 更多信息 如果复制 MAXDWORD 常数在 API 文本查看器中,您可以获得: Const MAXDWORD = &HFFFF 反而,您应使用此: Const MAXD... 如果复制 MAXDWORD 常数在 API

多次调试后,即使退出VB IDE也不能完全初始化USB串口,有时候看起来有数据,但是不准确,重启一下OK.

API 文本查看器为 MAXDWORD 常量提供了不正确的值。 更多信息 如果复制 MAXDWORD 常数在 API 文本查看器中,您可以获得: Const MAXDWORD = &HFFFF 反而,您应使用此: Const MAXD... 如果复制 MAXDWORD 常数在 API 文本查看器中,您可以获得:
Const MAXDWORD = &HFFFF				
反而,您应使用此:
Const MAXDWORD = &HFFFFFFFF				

另外:VB timer 在10mS级基本没法用,我用50mS都不行,100mS快50%

5.通讯设定对话盒

  Win32 API 中提供了一个开启通讯设定对话盒的 API: CommConfigDialog(),当呼叫这个 API 时,会蹦现一个可供设定 Baud Rate,Data Bits,Parity .. 等信息的对话盒,programmer 可以利用它来让使用者设定一些信息,并且取得结果.

BOol CommConfigDialog(
LPTSTR lpszname,// pointer to device name string
HWND hWnd,// handle to window
LPCOMMCONfig lpCC // pointer to comm. configuration structure
);

  其中 lpCC 被用来存放设定值的结果.

typedef struct _COMM_CONfig {
DWORD DWSize;
WORD wVersion;
WORD wReserved;
DCB dcb;
DWORD DWProvIDerSubType;
DWORD DWProvIDerOffset;
DWORD DWProvIDerSize;
WCHAR wcProvIDerData[1];
} COMMCONfig,*LPCOMMCONfig;

  在我们呼叫 CommConfigDialog() 之前,DWSize 要设为 sizeof(COMMCONfig),wVersion 的值在这边似乎不重要(我不清楚,VC5 的 on-line help 说可以设为 1,我手中的 book 的范例是设为 0x100),呼叫完 CommConfigDialog() 之后,成员 dcb 中的 Baudrate,ByteSize,StopBits,Parity 就是使用者的设定.

  6.Timeout 的机制

  因为传输时并不会维持一个绝对稳定的速率. 因为传输品质的关系,programer 会需要 timeout 的机制来协助他们做一些控制. 在 Win32 通讯 Timeout 的机制中,timeout 的性质共分为两类,先来看看 COMMTIMEOUTS 这个结构:

typedef struct _COMMTIMEOUTS { // ctmo
DWORD ReadIntervalTimeout;

DWORD ReadTotalTimeoutMultiplIEr;
DWORD ReadTotalTimeoutConstant;
DWORD WritetotalTimeoutMultiplIEr;
DWORD WritetotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

  programmer 可以利用 GetCommTimeouts() 和 SetCommTimeouts() 来读取或是设定目前的 timeout 值.

BOol GetCommTimeouts(
HANDLE hfile,// handle of communications device
LPCOMMTIMEOUTS lpCommTimeouts // address of comm. time-outs structure
);

BOol SetCommTimeouts(
HANDLE hfile,// handle of communications device
LPCOMMTIMEOUTS lpCommTimeouts // address of communications time-out structure
);

  第一种 timeout 的机制称为 interval timeout,从字面上的意义很容易可以理解这种 timeout 的机制是读取字符之间的间隔时间的 timeout,只有读取字符时才能够使用interval timeout. 也就是在这个结构中的 ReadIntervalTimeout,单位为 ms,当读取完一个字符后,超过了 ReadIntervalTimeout 的值,却还没有读到下一个字符时,timeout 就发生了.

  第二种 timeout 的机制称为 total timeout,顾名思义即是传输的总时间的 timeout . 在这种 timeout 的机制下,Win32 提供了一个具有d性的方式来设定 total timeout. 以读取的 total timeout 为例,利用 ReadTotalTimeoutMultiplIEr 和 ReadTotalTimeoutConstant 构成了一个线性的上限值. 什么意思呢? 实际上的 total timeout 应该是这样的一个式子:

  ReadTotalTimeout = ReadTotalTimeOutMultiplIEr*BytesToRead+ReadTotalTimeoutConstant

  WritetotalTimeout 用同样的公式来计算. 这样的话,不仅可以用一个固定的值来做为 timeout 值,也可以用条线来做为 timeout 的值,而随着要读取或是要写的 bytes 数而变动.

  如果不想使用 timeout,就把 COMMTIMEOUTS 里头的资料成员都填为 0.

  如果你将 ReadIntervalTimeout 设为 MAXDWORD,且将 ReadTotalTimeOutMultiplIEr 和 ReadTotalTimeoutConstant 都设为 0 的话,那么读取时,如果 receive queue 里头并没有资料,读取的动作将会马上返回,而不会停滞在读取的动作.

  这里有一个和 BuildCommDCB() 很像的 API 叫 BuildCommDCBAndTimeouts():

BOol BuildCommDCBAndTimeouts(
LPCTSTR lpDef,// pointer to the device-control string
LPDCB lpDCB,// pointer to the device-control block
LPCOMMTIMEOUTS lpCommTimeouts // pointer to comm. time-out structure
);

  lpDef 一样是控制字符串,可以给像 BuildCommDCB() 中的 lpDef 那样格式的字符串,但是多了 "TO=XXX" 这个设定. 如果 "TO=ON",这个 API 会依据 lpCommTimeouts 里头的值来设定读和写的 timeout 值. 如果 "TO=OFF",则会设定这个 device 没有 timeout. 如果是 "ON" 和 "OFF" 之外的其它值,则 lpCommTimeouts 的设定将会被忽略.

  对了,在设定完 timeout 值之后,记得要检查 COMMPROP 里的 DWProvCapabilitIEs 中的 PCF_INTTIMEOUTS 和 PCF_TOTALTIMEOUTS 两个 flags 是否有被 set,以确认 interval timeout 和 total timeout 是否有支持.

总结

以上是内存溢出为你收集整理的调试VB *** 作USB串口多次失败后,重启一下机器全部内容,希望文章能够帮你解决调试VB *** 作USB串口多次失败后,重启一下机器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1292055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存