环境:PC,PDA
开发:C#,CF
记事:
原来PC通过USB和PDA进行连接的时候,安装ActiveSync同步工具。PC程序中调用OPENNETCF的类RAPI进行读写文件。
RAPI的使用方式很简单,因为类似Windows一样的文件路径进行操作就可以了。
后来改用串口后,不知道使用什么方式进行同步(尝试ActiveSync配置后没有起作用)(问题1:如何同步)。所以考虑串口传输的编程方式。
初步查找资料发现。串口传输类似SOCKET编程。System。IO。Ports定义一个SerialPort对象,就可以对串口读写。没开心多久,问题来了。当我想实现通过串口将一个文件传到PDA,是否表示,我需要在PC上写一个程序,调用时往com1写N个Bit,然后PDA也得写一个程序接收Bit,将其写到文件中(问题2:PDA如何创建文件并写Bit到文件);然而,PDA端使用应用程序的方式岂不是代表两个程序得同时运行?按Socket编程的方式,PDA端应该是编写监听程序,以服务的形式的话(问题3:PDA可以写Window服务监听吗)。后记:没有任何这方面的经验,所以一方面立贴求教,一方面记录这段时间学习的看法。见笑了。问题解决之日,散分之时。
开发:C#,CF
记事:
原来PC通过USB和PDA进行连接的时候,安装ActiveSync同步工具。PC程序中调用OPENNETCF的类RAPI进行读写文件。
RAPI的使用方式很简单,因为类似Windows一样的文件路径进行操作就可以了。
后来改用串口后,不知道使用什么方式进行同步(尝试ActiveSync配置后没有起作用)(问题1:如何同步)。所以考虑串口传输的编程方式。
初步查找资料发现。串口传输类似SOCKET编程。System。IO。Ports定义一个SerialPort对象,就可以对串口读写。没开心多久,问题来了。当我想实现通过串口将一个文件传到PDA,是否表示,我需要在PC上写一个程序,调用时往com1写N个Bit,然后PDA也得写一个程序接收Bit,将其写到文件中(问题2:PDA如何创建文件并写Bit到文件);然而,PDA端使用应用程序的方式岂不是代表两个程序得同时运行?按Socket编程的方式,PDA端应该是编写监听程序,以服务的形式的话(问题3:PDA可以写Window服务监听吗)。后记:没有任何这方面的经验,所以一方面立贴求教,一方面记录这段时间学习的看法。见笑了。问题解决之日,散分之时。
PDA和PC同步上以后PDA就有一个串口了,但是PC端还是USB,SOCKET传输找了半天没有找到方法
今天完成其他工作,开始学习这个。经过早上的资料
http://social.msdn.microsoft.com/Forums/zh-CN/vbes/thread/ad10b043-5151-4848-bf82-dce2d346c52a
http://topic.csdn.net/u/20110727/20/29a98cc0-8382-4293-b194-fbbf45dead09.html?78252
两者发现:
1.接收数据,可能导致主线程阻塞,所以使用invoke方法更新界面。
2.DataReceived方法相应数据接收。实践过程:
1.先下载一个虚拟串口软件。
2.开发PC端COM程序。
3.开发PDA端COM程序,部署时设置外置设备映射COM1。实践过程问题总结:
1。DataReceived事件中不应该使用serialPort.Read()的方式获取数据集,因为这样会PDA阻塞等待COM口输入数据,应该判断e.EventType 是字符就取属性ReadExisting。
2.尽管按这种写法,如果PDA获取数据操作后,PDA发送数据会导致阻塞,这个问题下午再看看。
3.串口通信是如何保证传输数据没有丢包的呢?是自身保证还是需要代码中实现进行保证?下一阶段工作:
1.测试串口流传输有没问题,然后实现文件传输。
1.DataReceived事件中是应该用ReadChar方法的。因为测试时发现PDA数据常常发送不完整。所以需要增加一个终结符来表示发送结束。因此在DataReceived事件中需要通过多次接收进行整合数据。
2.PDA和PC传输过程中发现交叉使用发送接收两个操作导致的PDA执行WriteLine后停止的情况,解决方式是设置超时属性。个人设置为500.
第三点还是不了解。呵呵,再说。
如果你对socket变成熟悉的话,这些应该难不住你。
串口编程,只要串口的可以打开的,就可以向串口发送数据,
而不管串口是连接了其他设备,这个socket(tcpip)不同,
所以,必须要加超时和数据校验,数据重发,重发次数,等等校验。
造成实际的通讯速率远远没有串口标称的通讯有效速率高。
你看,
while(true)
{
serialPort.Write("A-B\0");
//这里希望等待答复的时候,如果直接是read,测试的时候发现,会多次走写的步骤。
//我估计,串口写的时候就只管写东西,并不会因为Read停下来进行Read的事情。
//事实上,我觉得执行Read的时候,是主进程创建一个辅助线程进行DataReceved的接收事件。
//而且debug过程发现,接收数据事件并不会响应自己定义的某信号变量(变量一直是初始值)。
byte[] answer=new byte[10];
serialPort.Read(answer,0,10);
if(CheckByte(answer))break;
}
总之,串口通信过程中,写,读貌似不是在一个线程中完成,而是读在异步进行,导致通信过程无法控制。PS:该情况当直接运行时候貌似没有问题,当在Debug时候就有上面问题了。
写的很乱,估计开发过的人有体验
//开始通信
//报头
while(true)
{
serialPort.Write("报头信息");
serialPort.Read("反馈信息");
if(反馈正确)break;
}
//内容
//分块
for(文件的每一块)
{
while(true)
{
serialPort.Write("内容");
serialPort.Read("反馈信息");
if(反馈正确)break;
}
}
这样写法遇到下面两问题:
1。顺序执行每一块的时候,在serialPort.Write("内容")后,Read()方法偶尔会超时。
2.成功全部执行完后,接收方的SerialPortAccept的数据接收事件中还会不停触发。
有经验的同志帮忙啊。。
和以前一样,先同步,再rapi
如果自己实现文件收发,也很容易,自己需要创建一套协议,并且考虑好协议的安全性、可恢复性、断点续传等功能。
应该如何调试?
应该如何调试?