调试VB操作USB串口多次失败后,重启一下机器
来源:互联网 发布:微信软件军团 编辑:程序博客网 时间:2024/05/13 09:36
多次调试后,即使退出VB IDE也不能完全初始化USB串口,有时候看起来有数据,但是不准确,重启一下OK.
更多信息如果复制 MAXDWORD 常数在 API 文本查看器中,您可以获得: Const MAXDWORD = &HFFFF 反而,您应使用此: Const MAXD...
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 提供了一个具有弹性的方式来设定 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串口多次失败后,重启一下机器
- Openstack Swift 组件搭建成功后,重启机器失败的解决方案
- 关于串口,重启计算机后总是连接不上,用串口调试工具打开一次以后才能连接上
- putty usb转串口调试
- 用VB调试串口通讯
- 用VB调试串口通讯
- 用VB调试串口通讯
- VB 串口调试助手源代码
- 串口调试助手---VB源代码
- USB转串口驱动安装失败解决方法
- 请问安装IVT软件后,USB蓝牙适配器在编程上,可以当成串口操作吗?
- 请问安装IVT软件后,USB蓝牙适配器在编程上可以当成串口操作吗?
- 修改Redhat系统时间,重启机器失败
- Android虚拟机 USB转串口调试方法
- VB 串口编程调试代码(1)
- 重启系统后1158/EM启动失败的解决办法
- Linux主机名修改后导致mysql重启失败
- ubuntu突然断电后,重启失败解决方案
- poj2391 Ombrophobic Bovines
- ExtJs 项目对话框001
- 数据结构之线性结构(双链表)【四】
- Android 模拟器使用SD卡
- 年轻的女人炫富,无非就是两种情况
- 调试VB操作USB串口多次失败后,重启一下机器
- C语言中的INF和NAN
- c++运算符优先级表
- phpcms v9 二次开发之构建模块全过程 by cubeking
- GetSetting函数
- SSRS 教程
- 编程产生一个int数组,长度为30,并向其中随机插入1-30,并且不能重复输出数组。实现一个冒泡排序算法对其进行排序,输出排序结果
- GFS故障解决
- 分页!存储过程!后台代码!