Re[8]: Что определяет ReadTimeout SerialPort?
От: Andrej-V  
Дата: 03.01.07 15:06
Оценка:
Здравствуйте, curvex, Вы писали:

C>Здравствуйте, Andrej-V, Вы писали:



AV>>>>А как в NET SerialPort определяет сколько байт прочитать: один, два, десять?

C>>>Думаю, что никак.

AV>>Я предполагал, что как-то используется какое-то время считывания или считывается определенное кол-во байт. Но или алгоритм более сложный (непонятно зачем) или определяется во время считывания какая-то другая величина (например, заканчивается время обработки сообщения — заканчивается считывание). Но не квантовая же механика пролезла в алгоритмы.

AV>>Хотя судя по вашему ответу — это вопрос не практического сорта.

C>SerialPort ждет _любое_ отличное от нуля количество байт в течении времени заданного ReadTimeout. Если хотя бы один байт пришел, его и вернет. Если не пришло ни одного байта — кинет TimeoutException.


Леонид. Я не понимаю. Приходит всегда сначала один байт (потом, возможно, 2-й. 3-й и т.д.).
Значит и считываться должен только один байт. А если несколько, то должен быть алгоритм: сколько байт еще подождать, сколько времени. Но время ReadTimeout не выжидается... Похоже на детскую задачку: сколько байт придет в ответ, если ...(а условие не задано). Тогда должно всегда — один (первый).

Следующая программка демонстрирует что ReadTimeout — время, в течение которого возможно считывание с порта. Здесь, наконец, время не меньше ReadTimeout. Но не понимаю куда девается буква A: в ответе на команду ATZ приходит TZ.


using System;
using System.Text;
using System.IO.Ports;
using System.Threading;

namespace ConsoleApplication5
{
class Program
{
static string RecvString(SerialPort com)
{
byte[] MyArray = new byte[1];
string s = "";
System.Text.ASCIIEncoding oEncoder = new ASCIIEncoding();

try
{
while (com.Read(MyArray, 0, 1) == 1) if (s != "") s += oEncoder.GetString(MyArray); else s += "!";
return s;
}
catch (TimeoutException e)
{
return s;
}
catch (Exception e)
{
s = "";
return s;
}
}
static void Main(string[] args)
{
SerialPort com = new SerialPort("COM1", 115200, Parity.None, 8, StopBits.One);
if (com.IsOpen) com.Close();
com.ReadTimeout = 3000;
com.WriteTimeout = 1400;
com.DtrEnable = true;
com.Open();
Thread.Sleep(1500);
com.Write("ATZ\r\n");
// Thread.Sleep(500);
DateTime dt1 = DateTime.Now;
string s = RecvString(com);
TimeSpan ts = DateTime.Now — dt1;
Console.WriteLine("Ответ: "+s+" Время: "+ts.TotalMilliseconds.ToString());
com.Close();
Console.ReadLine();
}
}
}


C>Вообще, есть такая программка: PortMon.

C>Показывает байтики передаваемые и принимаемые последовательным портом (точнее его драйвером), команды отправляемые ему приложением и проч. В том числе показывает время этих событий, и, насколько я помню, использует таймер с более высоким разрешением для замера интервалов. Попробуйте ее.


Спасибо, но скачать ее сейчас невозможно: что-то сгорело на АТС, еле-еле с 3- 4 -й попытки на 9600 соединяюсь с провайдером и если успеваю до разрыва связи прочитать свою ветку — уже почти счастье.

Спасибо за ответы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.