HPC.ru lite - Все форумы
Форум: Программирование для КПК
Тема: Виснет DataReceived! Помогите.

[Ответить]
daldenis [01.12.2008 22:35] Виснет DataReceived! Помогите.:
Добрый день!
У меня такая проблема: программа общается с устройством через Bluetooth как с Com портом.
В кпк порт на передачу com8, на приём com7. Но реально передача и приём работают на com8. Теперь вопрос: программа нормально принимает пакеты с устройства, пока не передать ему пакет с командой. Приём прекращается, а передача работает!

void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (FlagPorta)
{
byte c;
int buf_count = serialPort1.BytesToRead;
while (serialPort1.BytesToRead > 0)//(buf_count>0)
{
byte inputData = new byte;
// read the character
serialPort1.Read(inputData, 0, 1);
Encoding enc = Encoding.ASCII;
//displayString = enc.GetString(inputData, 0, inputData.Length);
//displayString = string.Empty;
//Обработчик получения байта из COM-port
c = inputData;
if ((fill_packet_flag == false) && (c != START))
{
return;
}
if (c == START) //если начало пакета -
{
fill_packet_flag = true; // - будем принимать пакет со след. символа
double_char_flag = false; //init
InBufLen = 0; //init
goto NextChar;
}
//БЫВАЕТ, что приходят символы ВНЕ пакета.
//но а если пакет уже на стадии приема, т.е. ПОСЛЕ старт-символа - то принимаем:
if (fill_packet_flag == true)
{
if (c == STOP) //если конец пакета -
{
InBuf2 = InBuf;
fill_packet_flag = false; // - завершаем прием пакета
FlagPorta = false;
ProcessPacket(); // !!! обработка пакета()
return; // и - выход
}
if (double_char_flag == true) //если это второй символ комбинации:
{
switch (c) // - то декодирование комбинации
{
case MODIF:
c = MODIF;
break;
case START_2:
c = START;
break;
case STOP_2:
c = STOP;
break;
default: //ошибка в кодировке пакета. Пакет отвергается:
fill_packet_flag = false;
return;
}
double_char_flag = false; //декодировали комбинацию.
}
else //и если первый:
{
if (c == MODIF) //начало комбинации(модификатор) ?
{
double_char_flag = true; //ничего не принимаем, exit, wait next
goto NextChar;
}
} //простой символ
}
//проверка на переполнение вх.буфера:
if (InBufLen >= MAXINBUFSIZE)
{
fill_packet_flag = false; //аннулируем пакет, возврат в исходное состояние.
//goto NextChar;
return;
}
//занесем символ с в буфер.
InBuf[InBufLen] = c; //занесение символа в буфер
InBufLen++;
NextChar:
c = 0;
}
}
return;
}

И передача:

private void SendPacket(byte Kommand)
{
byte CRC = 0;
byte OutBuf = new byte; //длина пакета с учетом длины данных
//Заполняем пакет данных побайтно
OutBuf = START;
OutBuf = 64;
OutBuf = Kommand;
//вычисляем CRC заголовка
CRC = CalcCS(OutBuf, 1, 2);
OutBuf = CRC;
OutBuf = STOP;
serialPort1.Write(OutBuf, 0, 5);
}

Помогите пожалуйста!
[Ответить]