В настоящее время в моем университете мы поддерживаем связь между этими старыми модемами 56k. Поскольку сообщения от ПК к модему проходят через последовательный порт, я решил использовать класс System.IO.Ports.SerialPort .NET.
Я написал довольно большое приложение на C # для связи с модемом, дозвона до другого модема и связи через них. Все работало нормально, пока мне не удалось установить соединение между двумя модемами. Когда это происходит, оба модема (как и должно быть) переключаются из режима COMMAND (где я могу отправлять команды Hayes модему) в режим DATA (где все данные, которые я отправляю модему, перенаправляются на другой модем).
Мое приложение может как отправлять вещи, так и получать их через последовательный порт. Он установлен на обоих подключенных ПК. Но когда я что-то набираю в своем приложении, например «Здравствуйте», с другой стороны не получено. А вот и самое странное. Вот как я отправляю сообщения через последовательный порт («порт» - это экземпляр класса SerialPort, «данные» - это экземпляр строки):
port.Write(data);
Так что работает. Это должно работать. Тем более, что если я использую свое приложение для отправки с одной стороны и PuTTy для приема с другой - это работает! PuTTy, подключенный к действующему последовательному порту, получает мое сообщение. Это также означает, что не только мое сообщение приходит на первый модем; он отправляется по сети на другой модем, а затем другой модем отправляет его через последовательный порт на принимающий ПК. Но это не все. Когда я использую свое приложение для приема, я использую событие SerialPort.DataReceived, как это (конечно, метод был + = ed для обработчика событий):
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//this message box should pop up if event hit:
MessageBox.Show("Data from serial port received!");
//calling my method to handle incoming message
DataReceived((SerialPort)sender);
}
И это работает, когда модем (подключенный к принимающему ПК) находится в режиме КОМАНДА. Например. когда я посылаю модему команду «AT» Хейса (что означает не что иное, как «пинг»), модем отвечает «ОК», и я получаю ее. Событие SerialPort.DataReceived запускается. Но когда этот модем находится в режиме DATA (когда я не могу посылать ему команды Хейса), и он получает сообщение об отправке модема и пересылает его на последовательный порт - ничего. Событие даже не срабатывает. Я хорошо это проверил.
Это странно!
Это только подводит меня к выводу, что способ, которым модем отправляет сообщение на последовательный порт, немного отличается в режиме DATA и в режиме COMMAND, и PuTTy каким-то образом понимает этот другой способ, а класс SerialPort - нет.
Я действительно этого не понимаю.