Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > COM порт, нужен совет


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

Код

Send(char* Buff, int szBuff)


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


Автор: 586 14.7.2010, 13:38
Цитата(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);

Автор: 13dreams 14.7.2010, 15:20
Благодарю! 

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

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

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



Автор: 586 14.7.2010, 15:59
Цитата
А если порт получит значение, допустим, 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).

Автор: 13dreams 14.7.2010, 17:51
Спасибо, всё предельно понятно

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

эмулирую что-то типа вольтметра : когда отправляю в устройство символ "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)> "АБ"

и чего так происходит? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)