-1

what should i do to wait until all the data sent to serial port

to test this condition assume the code bellow:

            Console.WriteLine("Baud is:" + SerialPortObj.BaudRate);
            Console.WriteLine(DateTime.Now.Millisecond);
            string tmpStr="";
            for (int i = 0; i < 100; i++)
            {
                tmpStr += "A";
            }
            SerialPortObj.Write(tmpStr.ToCharArray(),0,99);
            Console.WriteLine(DateTime.Now.Millisecond);

example output is:

Baud is:300

97

97

And it indicate that .Net is not waiting until all chars to be send!

just to mention the code below does not work:

            Console.WriteLine("Baud is:" + SerialPortObj.BaudRate);
            Console.WriteLine(DateTime.Now.Millisecond);
            string tmpStr="";
            for (int i = 0; i < 100; i++)
            {
                tmpStr += "A";
            }
            SerialPortObj.Write(tmpStr.ToCharArray(),0,99);

            while (SerialPortObj.BytesToWrite>0)
            {
                Thread.Sleep(1);
                Console.WriteLine(SerialPortObj.BytesToWrite);
            };

            Console.WriteLine(DateTime.Now.Millisecond);

example output is:

Baud is:300

97

97


i am working on an special protocol that is depends on baud rate change over and use some thing like the follow:

       ->[Send Some Bytes (Baud300)] 

       <-[Receive Another Bytes (Baud9600)]

so i want to send some chars by write method and wait until it finish and right after finishing i try to change baud , so i could understand the received bytes


is there any idea?

4

3 回答 3

2

首先,串行端口是无状态的。因此,您永远无法真正确定何时达到更改波特率的正确时间点。由于您要实现自己的特殊协议,因此您必须控制通信的双方(发送方/接收方)。所以在这种情况下,我强烈建议也将Handshake属性设置为RequestToSend并检查DtrEnable属性。

此外,您应该在通信的每个站点上使用两个缓冲区(接收/传出),这些缓冲区由它们自己的任务/线程监视。如果您将某些内容推送到传出缓冲区,该任务会检查是否可以发送(CtsHolding, DsrHolding),如果可以,则更改波特率并将该数据推送到线路上。等到保持属性设置回来,然后将波特率更改为其他值。在这种情况下,传入线程非常简单。它只是等待DataReceived事件,因为波特率的变化是由传出任务完成的。

如果您使用硬件握手(在您的情况下我强烈推荐),那么请确保您的串行端口正确支持它。大多数 USB 转串行适配器不能与 19200-8-N-1 以外的任何其他设备很好地配合使用。因此,在您认为自己没有正确编码或SerialPort课程有问题之前,请尝试找到两台具有真正串行端口的机器(或一台具有两个端口的机器进行测试)。

于 2012-08-27T11:13:07.320 回答
0

尝试将数据存储在变量中,当出现特定条件(可由您设置)时,将变量的值发送到串行端口

于 2012-08-27T07:52:46.327 回答
0

用硬件做吗?

您可以尝试使用配置为 300/9600 的两个串行适配器。一个是 Tx,另一个是 rx。您需要一根“有趣的电缆”,将 2/3 针分成不同的 D 型,但这应该可以。

于 2012-08-27T12:27:18.413 回答