中断传输问题

我想用下位机以中断传输方式通知上位机程序动做,可是不太稳定,有时上位机可以收到中断但数据都为0,有时程序就死掉了。不知什么原因,网上也没有更多的关于中断传输资料供参考。批量上传下传都没问题。请指教,谢各位大侠!

\\以下是下位机部份关键代码,其它略

while(1) { if(!Key1){ //当key1按下通知上位机软件动做 EX0 = 0; //CH372中断INT连接单片机中断INT0 CH375_WR_CMD_PORT(CMD_WR_USB_DATA5);//用中断传输通知PC Delay2us( ); cnt=8; CH375_WR_DAT_PORT(cnt); //发送8个字节 do{ CH375_WR_DAT_PORT(0xa5); }while(--cnt); EX0 = 1; } }

\\以下是上位机VB部份关键代码 private Sub Form_Load()

'--其它代码略 '-- '-- '-- mIndex=0 mCallInt

End Sub

Public Sub mCallInt()'此段代码在模块里 Dim x As Boolean x = CH375SetIntRoutine(mIndex, AddressOf mInterruptEvent) '调用中断子程序 End Sub

'此段代码在模块里 Public Sub mInterruptEvent(ByRef mBuffer As INT_PARA) '中断服务程序 Dim bool As Boolean bool = PostMessage(FormMain.hwnd, WM_KEYDOWN, 1, 0)' 中断特征数据1则键被按下 End Sub

Private Type DATA_PACKET ' 自定义的命令包结构 dat(8) As Byte ' 参数 End Type

'模拟调用窗体的按键按下事件 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Dim i As Integer Dim rbuf as DATA_PACKET CH375ReadInter 0, rbuf, 8 Cls For i = 0 To 8 Print rbuf.dat(i) Next End Sub

如果使用了CH375SetIntRoutine就不能使用CH375ReadInter,可以用CH375ReadData,下位机中断端点上传成功之后可以通过端点2来发数据,这样的话CH375ReadData就可以读到数据了.


另,下位机程序只要有键按下,就会上传数据,没有判断前一次是否传成功,在上传之前要等待前一次上传成功以后,才能继续上传。


非常感谢! 现在可以正常的收到中断,但反应有5S左右,这时间也太长了吧。 用CH375ReadData应该可以收到8个字节的数据吧,现在收到的数据还是全为0。


CH375ReadData是收端点2发送的数据,最大可以收64个字节,你下位即里端点1传完8个字节成功后再传通过端点2来发数据,mInterruptEvent(ByRef mBuffer As INT_PARA) 函数调用结束后那8个字节的数据就没有了,实际上已经被中断读走了,mBuffer里就是指向的那8个数据,但是mInterruptEvent函数调用结束后mBuffer就无效了,反应有5S左右应该是你设置超时5秒,然后CH375ReadData没收到数据,等待了5秒钟.


原来如此!很好,谢谢了!


问题又来了 有时可以接收到数据,有时设备插拔事件处理程序 pnpproce_KeyUp 提示 **CH372/CH375设备已拔出,然后就反应了。昨天还好好的,郁闷!

//单片机部份代码 while(1){ if(!key) { delayMs(300); EX0 = 0; CH375_WR_CMD_PORT(CMD_WR_USB_DATA5);//用中断传输方式通知上位机接收数据。 Delay2us(); CH375_WR_DAT_PORT(1); //写入数据长度 CH375_WR_DAT_PORT(0xa5); EX0 = 1;

Delay2us(); CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); //上传数据 Delay2us(); cnt=64; CH375_WR_DAT_PORT(cnt); //写入数据长度 do{ CH375_WR_DAT_PORT(cnt); }while(--cnt);

//EX0 = 1; } }

//VB部份代码 '模拟调用窗体的按键按下事件 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Dim i As Integer Dim rbuf as DATA_PACKET CH375ReadData 0, rbuf, 64 Cls For i = 0 To 63 Print rbuf.dat(i) Next End Sub


用USB屏蔽线,并且屏蔽线接地试试.


我觉得应该是程序的问题,批量上传下传都没问题,就是中断上传时候老是不稳定,最好给个例子,谢了!


如果提示"CH372/CH375设备已拔出",一般来讲都是下位机程序这边的问题,或者是没有用屏蔽线造成的,在ch372evt.zip中的ch372evt\vb中有个vb的例子.


我反复更换过三种不同质量的屏蔽线,而且批量上传下传都没问题,排除线的问题。 如果是下位机程序有问题请帮忙看下上面写的程序哪个地方有问题。 ch372evt.zip 里VB例子BULK、DEMO中没找到有中断传输数据的例子,只有不带数据的中断响应例子。


首先,你的程序上面肯定有问题. 其一,在你通过中断端点上传数据之后,每次写8个数据之后需要你等待372中断之后解锁之后在发送第2包数据. 其二,你的程序在每次发送的时候只能是发送一次,不能先写中断端点在写批量端点


CH372 中断问题搞了好久还是没能搞定,崩溃了, 帮帮看看我的程序倒底哪错了。 我的目的很简单,下位机以伪中断方式通知PC机接数据,可就是不稳定,有时可以收到数据,有时上位提示设备拔出。 批量下传和上传都没问题,线没问题。

MCU STC12C5410AD 24M晶振

附件:下位机程序keil C 和 VB上位机程序 UploadImages/200911515462697.zip


你先用一个叫bushound的软件监视一下,数据是否真的上传上来,要确定"有时可以收到数据"是数据没上传上来,还是你的编程造成的.你可以留个邮箱,我把这个软件发给你


你的下位机也有问题,读写函数的时序有问题 请参考CH372EVT\PUB\TEST\MCU\TEST.C的时序


看了你的程序,A0变化很有问题,写数据的时候一定要在CS=1之后再把A0拉高,否则就有可能导致CH372在采样的时候认为是命令,如果遇到数据0X05的时候,这样就会导致CH372复位,所以你会看到设备已经被拔出了,目前分析可能是这个原因导致的,你测试一下.


只有登录才能回复,可以选择微信账号登录