Рейтинг:
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
шпаклевать нельзя