Виснет DataReceived! Помогите.

Средства разработки, технические вопросы, отвечает (по мере сил) Отдел Разработок
Закрыто
daldenis
Новенький (0 lvl)
Сообщения: 1
Зарегистрирован: Пн дек 01, 2008 22:32

Виснет DataReceived! Помогите.

Сообщение daldenis » Пн дек 01, 2008 22:35

Добрый день!
У меня такая проблема: программа общается с устройством через 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[1];
// 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[0];
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[5]; //длина пакета с учетом длины данных
//Заполняем пакет данных побайтно
OutBuf[0] = START;
OutBuf[1] = 64;
OutBuf[2] = Kommand;
//вычисляем CRC заголовка
CRC = CalcCS(OutBuf, 1, 2);
OutBuf[3] = CRC;
OutBuf[4] = STOP;
serialPort1.Write(OutBuf, 0, 5);
}

Помогите пожалуйста!

Закрыто

Вернуться в «Программирование для КПК»