在
http://topic.csdn.net/u/20090421/13/494fb20a-704a-431c-9c42-7b637d06e22c.html
贴了很久没人能解决。
现在的环境是这样:
(1)系统中安装了ELTIMA Virtual Serial Port虚拟串口对(COM5 <-->COM6)
(2)上位机程序是
private SerialPort sp;
public Form1()
{
InitializeComponent();
sp = new SerialPort("COM5", 9600, Parity.Odd, 8, StopBits.One);
sp.Open();
} private void button1_Click(object sender, EventArgs e)
{ byte[] b ={ 0xA0, 0x33, 0x1C, 0x01, 0x05 };
sp.Parity = Parity.Odd;
sp.Write(b, 0, 1);
sp.Parity = Parity.Mark;
sp.Write(b, 1, 1);
} 下位机(模拟)程序也运行在同一台计算机上,不管用什么语言编写,关键是如何获取上位机发送过来的数据校验位?
当然两者事先约定,第一字节用Odd,第二字节用Mark,但是下位机方必须把数据校验位获取到,才能进行判别。
---------------------
请真正的高手把下位机程序不管用什么语言(开发环境)编写出来,分不够另外开帖子再加。
http://topic.csdn.net/u/20090421/13/494fb20a-704a-431c-9c42-7b637d06e22c.html
贴了很久没人能解决。
现在的环境是这样:
(1)系统中安装了ELTIMA Virtual Serial Port虚拟串口对(COM5 <-->COM6)
(2)上位机程序是
private SerialPort sp;
public Form1()
{
InitializeComponent();
sp = new SerialPort("COM5", 9600, Parity.Odd, 8, StopBits.One);
sp.Open();
} private void button1_Click(object sender, EventArgs e)
{ byte[] b ={ 0xA0, 0x33, 0x1C, 0x01, 0x05 };
sp.Parity = Parity.Odd;
sp.Write(b, 0, 1);
sp.Parity = Parity.Mark;
sp.Write(b, 1, 1);
} 下位机(模拟)程序也运行在同一台计算机上,不管用什么语言编写,关键是如何获取上位机发送过来的数据校验位?
当然两者事先约定,第一字节用Odd,第二字节用Mark,但是下位机方必须把数据校验位获取到,才能进行判别。
---------------------
请真正的高手把下位机程序不管用什么语言(开发环境)编写出来,分不够另外开帖子再加。
直接用虚拟串口对连接两个应用程序,不是真实的工业应用,看来SerialPort类是不行了,不知道用win32 API的CreateFile之类行不,实在不想去弄那个麻烦的驱动程序
对于真实的下位机,如果上位机程序校验方式设置错误,是收不到下位机反馈回来的数据的(或是收到错误信息)
在教学中模拟一个下位机,学生学习上位机编程,如果他的的程序写得不对,应该达到和连接真实下位机一样得效果
sp.Parity = Parity.Mark;//Even
Parity是可以自己计算的,把接收到字节判别一下1的个数。
sp.Write(b, 0, 1);
sp.Parity = Parity.Mark;
sp.Write(b, 1, 1);
你这里最大的编程问题是由于你擅自修改效验方式,而又不通知对方。
那么对方的程序在接收第一个数据后,即使是依照你的想法更改了效验,也很有可能收不到数据。
主要原因是:发送和接收的时间不对称。
LZ你这种实现,应该属于无效验、自适应的通讯协议。
这种协议最典型的特点就是发送和接收脱离,发送数据后,根本没有考虑对方是否有正常接收,也不接收对方的返回,非常容易出现通讯不对称的情况,而造成通讯失败。
最少到目前位置,我还没有见过比较成功这样的通讯协议应用。LZ你这样的应用方式我们的系统有应用,但不是采用你这样的发送方式,我们通过制定数据协议,通过请求=应答机制在通讯的过程临时改变通讯效验位。
但是问题还是没有解决呀,假设我整个数据块都用Odd校验,下位机方还是要获得校验位才行期待能有API层的解决方法,如果如lfchen 所说必须自己写驱动,就没有办法了
int CheckParity(char bits7)
{
__asm
{
XOR EAX,EAX;=0
ADD AL,bits7;
JNP IsOdd
}
return 0;
IsOdd:
return 1;
}
//
void TestParity(void)
{
int ret;
char bin[40];
for (unsigned char kk=0;kk<128;kk++)//7 bits data
{
itoa(kk,bin,2);
int rest=8-strlen(bin);
strrev(bin);
for(int jj=0;jj<rest;jj++)
{
strcat(bin,"0");
}
strrev(bin);
ret=CheckParity(kk);
afxDump << kk << "=" << bin << " Parity= " << (ret ? "Odd" : "Even") << "\n";
Sleep(80);
}
}
//结果:
0=00000000 Parity= Even
1=00000001 Parity= Odd
15=00001111 Parity= Even
16=00010000 Parity= Odd
17=00010001 Parity= Even
PIC单片机中八位单片机不支持硬件校验位,需要通过设置接收方式为9位数据接收,把第9位做为校验位,自已计算并比较。我在写WINCE程序时,也发现一个问题,利用win 32API,不能产生带校验位的数据,即不能向外发送含有校验位的数据,接收时,把具有校验位的数据自动去除了校验位。请教各位如何解决.