mstftrn Ответов: 5

связь через последовательный порт


всем привет
у меня есть устройство под названием nonin 9560 (пульсоксиметр), которое связывается по bluetooth
я работаю над windows 7 visual 2008 c++
у меня есть код, который пытается считывать данные с устройства(данные-это насыщение кислородом для ex 98)
но проблема в том, что я не могу прочитать данные!
ReadFile не работает!
пожалуйста, помогите мне...........
вот код:

int main(int argc, char* argv[])
{
	char INBUFFER[5000] = {'\0'};
   
    DWORD        bytes_read    = 0;    // Number of bytes read from port
    HANDLE       comport      = NULL;  // Handle COM port
	int   bStatus;
    DCB          comSettings;          // Contains various port settings
    COMMTIMEOUTS CommTimeouts;
   

    // Open COM port
    if ((comport = CreateFile("COM3:",                // open com5:
                    GENERIC_READ | GENERIC_WRITE, // for reading and writing
                    0,                            // exclusive access
                    NULL,                         // no security attributes
                    OPEN_EXISTING,              
                    0,
                    0)) == INVALID_HANDLE_VALUE)
    {
        printf("cannot open\n");
    }
    
	
	/*Set timeouts in milliseconds*/


		GetCommTimeouts (comport, &CommTimeouts);

		// Change the COMMTIMEOUTS structure settings.
		CommTimeouts.ReadIntervalTimeout = MAXDWORD;  
		CommTimeouts.ReadTotalTimeoutMultiplier = 0;  
		CommTimeouts.ReadTotalTimeoutConstant = 0;    
		CommTimeouts.WriteTotalTimeoutMultiplier = 10;  
		CommTimeouts.WriteTotalTimeoutConstant = 1000;    

		// Set the timeout parameters for all read and write operations
		// on the port. 
		if (!SetCommTimeouts (comport, &CommTimeouts))
		{
		  printf("SetCommTimeouts Error\n");
		}



     //Set Port parameters.
     //Make a call to GetCommState() first in order to fill
     //the comSettings structure with all the necessary values.
     //Then change the ones you want and call SetCommState().

	if (GetCommState(comport, &comSettings)==0){

		printf("GetCommState Error\n");
	}
	else
	{
		comSettings.BaudRate = 9600;
		comSettings.StopBits = ONESTOPBIT;
		comSettings.ByteSize = 8;
		comSettings.Parity   = NOPARITY;
		comSettings.fParity  = FALSE;

		bStatus = SetCommState(comport, &comSettings);
		try {
				if (bStatus == 0)
				{
					printf("SetCommState Error...\n");
				}
				BYTE Byte;
				DWORD dwBytesTransferred;



				// Read the data from the serial port.
				ReadFile (comport, &Byte, 1, &dwBytesTransferred, 0);

				// Display the data read.
				if (dwBytesTransferred == 1){
						ProcessChar (Byte);
				}

			  
					CloseHandle(comport);
		}
		catch( exception e)
		{
			CloseHandle(comport);
		}
	}
 return 0;
}


теперь у меня есть еще одна проблема!
я больше не могу открыть com3. СМТ случился.
любой другой программы, как оценка ОЕМ прога, шпаклевка, Геркулес может не открыть тоже.
они открывались в прекрасный день!!

Piccadilly Yum Yum

Может быть, аппаратная проблема... Убедитесь,что контакты RTS-CTS пересекаются..

Wendelius

Добавлены предварительные теги

CPallini

Почему бы вам не проверить возвращаемое значение ReadFile?

SnowHow

Вы проверили с помощью терминальной программы, что устройство передает данные?

Также... кажется, у вас есть лишняя точка с запятой ("COM3:") .... Попробуйте ("COM3") Также на всякий случай я предлагаю использовать форму"\\\. \\COM3"

5 Ответов

Рейтинг:
2

Olivier Levrey

Во-первых, вы должны использовать Геркулес[^] утилита для проверки того, что связь в порядке.

Если вы не можете общаться с Геркулесом, то у вас, вероятно, есть проблема с вашим устройством. В противном случае проблема исходит из вашего кода:
- Проверьте правильность всех параметров в вашем DCB структура.
- Проверьте возвращаемое значение из ReadFile а если он вернется FALSE, вызов GetLastError чтобы иметь дополнительную информацию.

Одна последняя вещь. То, как ты открываешь свой порт, мне странно. Самый безопасный способ открыть COM-порт-это:

//let's open COM3
int comNumber = 3;
//you should add "\\.\" before "COM3"
char comName[10];
sprintf(comName, "\\\\.\\COM%d", comNumber);
comport = CreateFile(comName, ...);


Если вы не используете "\\.\" у вас могут возникнуть проблемы с COM-портами, превышающими COM9.

-----------

Кстати, вам следует немного подождать после открытия порта, просто чтобы дать время для поступления данных.
Например, сделайте Sleep(2000) (подождите 2 секунды) перед вызовом ReadFile.


mstftrn

я сделал то, что вы сказали, но когда я выполняю: никакой ошибки...
я вижу, просто нажмите любую клавишу, чтобы продолжить!

Olivier Levrey

Это сообщение просто означает, что ваша программа закончена.

У вас нет ошибки? Так ReadFile возвращает TRUE и dwBytesTransferred равно 1? Так что у вас, вероятно, есть проблема в ProcessChar функция, не так ли?

Olivier Levrey

Я обновил свой ответ следующим образом Sleep

mstftrn

на самом деле, когда я использую только COM3: (я учусь в библиотеке msdn), я вижу нажатие любой клавиши...
но когда я использую" comNumber", порт не может открыться.
вот процессчар

unsigned char buffer[255] = {0};
int nextin = 0; / / следующее место для добавления нового символа
void ProcessChar(unsigned char c)
{

if (nextin < sizeof(buffer)) / / убедитесь, что есть место для символа

буфер[nextin++] = c;

}

mstftrn

я меняюсь вот так

if (ReadFile (comport, & amp; Byte, 1, & amp; dwBytesTransferred, 0)){

if (dwBytesTransferred == 1){
resp=байт;
ProcessChar (Байт);
printf ("smt-это странно");

вернуть true;
}
}else {printf ("не могу читать...");}

я не вижу никакого вывода printf!!

Olivier Levrey

Так это наверное потому что читать нечего: dwBytesTransferred равно 0.
Попробуйте использовать несколько значений Sleep (Я показал вам в своем обновленном решении).

mstftrn

Привет я делаю тебя занятым но
как вы сказали, я добавляю сон(10000)
и смотрите " smt-это странно"
и действительно странно не видеть считанных данных, но "smt-это странно"

Olivier Levrey

Если вы видите "smt is strange", это означает, что вы правильно прочитали 1 байт. Но я ничего не вижу printf В вашем ProcessChar функция. Если вы хотите, чтобы ваша программа выводила байт, который Вы читаете,то вы должны распечатать его...
printf("%c", Byte) или printf("%d", Byte). Или вы также можете использовать отладчик для отображения его значения (просто поставьте точку останова после функции ReadFile.

Peter_in_2780

Оливье сказал: Если вы не используете "\\.\", у вас могут возникнуть проблемы с COM-портами больше, чем COM9.
В Vista для этого требуются привилегии "Запуск от имени администратора"... Отлично работает на XP, не знаю, как насчет W7.

Olivier Levrey

Несколько лет назад я столкнулся с проблемами (не помню, был ли это Win2000 или WinXP). Использование "\\. \ " решило их. Взгляните на эту страницу:
http://msdn.microsoft.com/en-us/library/aa363858(v=против 85). aspx
раздел коммуникационные ресурсы
, написано: Чтобы указать номер COM-порта больше 9, используйте следующий синтаксис:"\\. \COM10". Этот синтаксис работает для всех номеров портов и оборудования, которое позволяет указывать номера COM-портов.

Peter_in_2780

Не хочу захватывать эту нить, так что просто быстро: У меня была программа, которая использовала Bluetooth для разговора с мобильными телефонами с помощью последовательной эмуляции. Необходимый \\.\ под XP, чтобы поговорить с COM13. Все благо. Затем в Vista он не может CreateFile () открыть \\.\COM13, если exe-файл не запущен от имени администратора. Ошибка, сообщенная M$ много лет назад, не получила ответа.

Olivier Levrey

Приятно знать, Спасибо.

mstftrn

привет Оливер,
не могли бы вы взглянуть на решение 3 (На самом деле вопрос!)
мне нужна еще помощь
спасибо

Рейтинг:
1

mstftrn

я не вижу своего последнего комментария, поэтому пишу еще раз, извините

- когда я использую \\.\ не удается открыть
- когда я использую \\\. \ \ (как сказал вчера Оливер) и использую свое устройство nonin, открывается и печатается
0 2 0 13 0 14 32
char buf[7];
Dword read = 0;
// Считывание данных с последовательного порта.
если (функцию ReadFile(вести,баф,оператор sizeof(buf с),&ампер;читать,нуль)){
DWORD i;
for (i=0; i & lt;read; i++){
printf ("%i", (unsigned char)buf[i]);
}

(я добавил выше код)

- когда я использую, когда я использую \\\. \ \ и не использую nonin устройство не может открыться...
- когда я использую \\\.\\, используйте мой nonin devíce и просто printf ("%c", байт) insdead кода выше открывается и печатает только 0.


Olivier Levrey

Поскольку это вопрос, вы должны использовать "улучшить вопрос" вместо публикации ответа...

Я не понимаю вашей проблемы:
1 - Вы можете успешно открыть свой порт с помощью "\\\\.\\COM3" -- > отлично
2 - Вы можете читать данные- & gt; отлично
3 - Вы можете распечатать данные- & gt; отлично

Чего ты хочешь еще?

mstftrn

извините за упущенную информацию но
выход (buf) 0 2 0 13 0 14 32 неверен
вывод printf ("%c", байт), который равен 0 или нулю, также неверен
на экране моего устройства nonin у нас есть насыщенность O2 и частота пульса для ex 98 и 70
я должен получить это.
так что мой вывод неверен...

спасибо за ваше время

Olivier Levrey

Знаете ли вы формат отправляемых данных? Может быть, ваше устройство посылает int ценности или short или, может быть, он посылает более сложный пакет. Проверьте его документацию, и вы узнаете, как читать данные. Я думаю, вам просто нужно правильно интерпретировать данные.

mstftrn

хорошо спасибо
Я попробую

Рейтинг:
1

Krhome

Я пытаюсь читать данные с того же устройства. Когда вы подключены, вы должны прочитать 22-битный буфер.
буфер[17] = HeartRate
буфер[19] = насыщение кислородом

Что касается меня, то когда я пытаюсь подключить свое устройство, оно не всегда работает. Я должен дождаться небольшой анимации на устройстве, а затем 9560 отправит только один раз информацию. У вас такая же проблема??


mstftrn

На самом деле моя проблема заключалась в неправильном формате данных. Формат данных дефолта устройства был форматом данных 13.
Мне нужно было изменить это, отправив 6-байтовую информацию. Мы должны использовать формат данных 8 или 2.
Ознакомьтесь с документацией устройства

mstftrn

вы можете посмотреть на это
http://www.codeproject.com/Questions/174373/how-to-read-hex-data-stream.aspx

Рейтинг:
1

User 7429338

Вы проверили, что Windows по-прежнему присваивает вашему устройству одно и то же имя порта? Если все программы имеют проблемы с чтением из COM3, это может быть связано с тем, что Windows теперь, например, присвоила вашему устройству имя COM4.

Вы можете проверить это, перейдя в Диспетчер устройств (если вы используете Windows XP; Control Panel > System & gt; Hardware > Device Manager) и взглянув на список в разделе порты (COM & LPT).


mstftrn

привет спасибо за ваш совет
под портами (COM & LPT) имеются
COM1
К COM3
Порт com4
но я попробовал oem eval prog для COM4, он не может подключиться
Геркулес просто откройте порт4
шпаклевать нельзя

Рейтинг:
0

Piccadilly Yum Yum

Посмотрите здесь на hardwire :

http://www.lammertbies.nl/comm/cable/RS-232.html[^]


Peter_in_2780

ОП сказал, что он использует Bluetooth (эмуляция последовательного порта), так что кабель не поможет!

Piccadilly Yum Yum

да... я думаю, что лучше отключить рукопожатие