Поиск:

Ответ в темуСоздание новой темы Создание опроса
> COM порт, нужен совет, --- 
:(
    Опции темы
13dreams
Дата 14.7.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.7.2010

Репутация: нет
Всего: нет



Скачал простенькую dll для работы с com портом. Прототип её функции записи (чтения) выглядит так 

Код

Send(char* Buff, int szBuff)


Передо мной задача - отправлять и принимать данные в 16ричной системе. Можно ли использовать эту dll?


PM MAIL   Вверх
586
Дата 14.7.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 6
Всего: 146



Цитата(13dreams @  14.7.2010,  14:33 Найти цитируемый пост)
Передо мной задача - отправлять и принимать данные в 16ричной системе. Можно ли использовать эту dll?

Можно. Функция Send принимает массив из типов char. А тип char может быть в пределах шестнадцатиричных чисел от 0x00 до 0xFF.

вернее так:
тип char от -0x80 до 0x7F
и тип unsigned char от 0x00 до 0xFF

А чтобы передать в функцию массив unsigned char достаточно привести массив к указателю на char*.
Код
unsigned char buf[20];
//...
Send((char*)buf, 20);


Это сообщение отредактировал(а) 586 - 14.7.2010, 13:55
PM   Вверх
13dreams
Дата 14.7.2010, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.7.2010

Репутация: нет
Всего: нет



Благодарю! 

А если порт получит значение, допустим, 0хF1

(прототип для функции приёма такой же), то это значение можно будет получить таким же способом?

или программа поведёт себя по-другому?



PM MAIL   Вверх
586
Дата 14.7.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 6
Всего: 146



Цитата
А если порт получит значение, допустим, 0хF1

будет либо так:
Код
unsigned char buf[20];
Recv((char*)buf, 20);
if(buf[0] == 0xF1) {
   // ...
}

либо так:
Код
сhar buf[20];
Recv(buf, 20);
if((unsigned char)buf[0] == 0xF1) {
   // ...
}

либо так:
Код
char buf[20];
Recv(buf, 20);
if(buf[0] == -0xF) {
   // ...
}


При выполнении преобразования (unsigned char*) к (char*) сами данные не изменяются. Преобразование делается для того, чтобы компилятор понял, что там беззнаковые числа (т.е. от 0x00 до 0xFF).

Это сообщение отредактировал(а) 586 - 14.7.2010, 16:11
PM   Вверх
13dreams
Дата 14.7.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.7.2010

Репутация: нет
Всего: нет



Спасибо, всё предельно понятно

И последнее - помогите добить код

эмулирую что-то типа вольтметра : когда отправляю в устройство символ "1" - оно присылает мне напряжение. Это всё делаю в таймере и всё работает

Код

void New1::OnTimer(UINT_PTR nIDEvent)
{
UpdateData(true);
        
        int len = 1;    
        sg.Send("1", len);
 
        char buff[128];
        int rcv = sg.Recv(buff, sizeof(buff));
        m_Napr.Empty();
        if(rcv > 0)
              m_Napr+=CString(buff);
              m_Napr = m_Napr.Left(rcv);
                UpdateData(false);
 
        CDialog::OnTimer(nIDEvent);
}


Задача - добавить ответ на символ "2".  Аналогично добавляю тот же код

Код

void New1::OnTimer(UINT_PTR nIDEvent)
{
        UpdateData(true);
        
        int len = 1;    
        sg.Send("1", len);
 
        char buff[128];
        int rcv = sg.Recv(buff, sizeof(buff));
        m_Napr.Empty();
        if(rcv > 0)
             m_Napr+=CString(buff);
        m_Napr = m_Napr.Left(rcv);
        UpdateData(false);
 
////////////////////////////////////////////
        UpdateData(true);
        sg.Send("2", len);
 
        int rcvf = sg.Recv(buff, sizeof(buff));
        m_Tok.Empty();
        if(rcvf > 0)
 
//m_Tok+=_T("RR");
m_Tok+=CString(buff);
 
UpdateData(false);
 
        CDialog::OnTimer(nIDEvent);
}


Результат должен быть такой: допустим мы принимаем символ "А" на запрос "1". И символ "Б" на запрос "2"
<первая строка(m_Napr)> "А"
<вторая строка(m_Tok)> "Б"

а у меня почему-то выходит так

<первая строка(m_Napr)> "АБ"
<вторая строка(m_Tok)> "" ---- здесь вообще пусто

Пробовал использовать два разных чаровских буфера - всёравно то же. 

Но если я дописываю строчку 
Код

m_Tok+=_T("RR");

перед 
Код

m_Tok+=CString(buff);


(она выше закоментирована) то результат такой

<первая строка(m_Napr)> "АБ"
<вторая строка(m_Tok)> "АБ"

и чего так происходит? 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0448 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.