Форум программистов, компьютерный форум CyberForum.ru

Com port (writefile кривая работа) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
Korbofos
3 / 3 / 0
Регистрация: 15.08.2011
Сообщений: 137
15.08.2011, 18:43     Com port (writefile кривая работа) #1
Подскажите в чём дело?
Пишу терминалку для управления мк. Необходимо отправить массив из трёх байт.
В место трёх байт на мк приходит 1 "левый" байт совсем не то что отправлял...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//---------------------------------------------------------------------------
С++ Builder
//инициализация порта
void Open_Port (char name)
{
char port_name[8];
sprintf(port_name, "COM%d", name);
hCom = CreateFile(port_name ,GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
if( hCom == INVALID_HANDLE_VALUE )
{
ShowMessage("Com port error");
CloseHandle(hCom);
}
else
{
GetCommState(hCom, &dcb);
dcb.fOutxCtsFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fInX = FALSE;
dcb.fOutX = FALSE;
 
 
dcb.fBinary = TRUE;
dcb.fAbortOnError = FALSE;
dcb.fNull = FALSE;
dcb.ByteSize = 8;
dcb.fParity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(hCom, &dcb))
{
CloseHandle(hCom);
ShowMessage("Com port error");
}
 
comm_timeouts.ReadIntervalTimeout = 5000;
comm_timeouts.ReadTotalTimeoutMultiplier = 5000;
comm_timeouts.ReadTotalTimeoutConstant = 5000;
comm_timeouts.WriteTotalTimeoutMultiplier = 5000;
comm_timeouts.WriteTotalTimeoutConstant =5000;
SetCommTimeouts(hCom, &comm_timeouts);
 
PurgeComm(hCom, PURGE_RXCLEAR);
PurgeComm(hCom, PURGE_TXCLEAR);
}
}
 
//функция записи в порт
char Write_Port (unsigned char *buf, size_t raz)
{
DWORD dwWritten;
WriteFile(hCom,buf,raz,&dwWritten,NULL);
if(raz==dwWritten)
{return 1;}
else
{return 0;}
}
 
unsigned char tx_buffer[3]={1,3,150};
 
//Записываем в порт три байта
if(Write_Port(tx_buffer,3)==false)
{ShowMessage("error write_port");}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2011, 18:43     Com port (writefile кривая работа)
Посмотрите здесь:

[C] ReadFile/WriteFile C++
WriteFile C++
C++ com port
C++ Работа с com port
Почему WriteFile не отправляет сообщение по каналу Pipe C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
paskal
418 / 267 / 22
Регистрация: 15.08.2011
Сообщений: 771
15.08.2011, 19:29     Com port (writefile кривая работа) #2
Цитата Сообщение от Korbofos Посмотреть сообщение
Подскажите в чём дело?
Пишу терминалку для управления мк. Необходимо отправить массив из трёх байт.
В место трёх байт на мк приходит 1 "левый" байт совсем не то что отправлял...
А мк - это микроконтроллер?
Что то я не вижу где вы настраиваете скорость СОМ порта. Проверьте, правильно ли согласованы скорости на ПК и МК. А еще в программе МК тоже могут быть ошибки, может ее тоже стоит показать.
Korbofos
3 / 3 / 0
Регистрация: 15.08.2011
Сообщений: 137
15.08.2011, 19:57  [ТС]     Com port (writefile кривая работа) #3
Да мк это микроконтроллер Atmega128
Скорость забыл после ряда изменений)))
Вернул назад(dcb.BaudRate = CBR_9600 картина та же.
Скорость мк и порта согласованны!
Программа мк
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
unsigned char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_index;
bit status_rx_buffer=EMPTY;
 
 
                                   //Interrupt's
 
interrupt [USART1_RXC] void usart1_rx_isr(void)
{
unsigned char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {rx_buffer[rx_index++]=data;}
if (rx_index == RX_BUFFER_SIZE) 
 {
 rx_index=0;
 status_rx_buffer=FULL;  //пришло три байта
 }
else
 {status_rx_buffer=EMPTY;} 
}
 
 
 
while (1)
 {
  while(status_rx_buffer==EMPTY); //Ждём прихода трёх байт
  switch (FUNCTION)  //rx_buffer[0]
  {
  case RADAR:
  radar();
  break;
 
  case ROBOMD2:
  robomd2(PARAM1,PARAM2); //rx_buffer[1] и rx_buffer[2]
  while(status_tx_buffer==FULL);
  FUNCT_TO_PC=ROBOMD2;
  PARAM1_TO_PC=PARAM1;
  PARAM2_TO_PC=PARAM2;
  return_connect;
  break;
 
  case SERVO:
  servo(PARAM1,PARAM2); //rx_buffer[1] и rx_buffer[2]
  while(status_tx_buffer==FULL);
  FUNCT_TO_PC=SERVO;
  PARAM1_TO_PC=PARAM1;
  PARAM2_TO_PC=PARAM2;
  return_connect;
  break;
 
  case ADC_FUNCT:
  start_adc(PARAM1); //rx_buffer[1] и rx_buffer[2]
  while(status_tx_buffer==FULL);
  FUNCT_TO_PC=ADC_FUNCT;
  PARAM1_TO_PC=read_adc();
  PARAM2_TO_PC=0;
  return_connect;
  break;
 
  default:
  FUNCT_TO_PC=0;
  PARAM1_TO_PC=0;              //
  PARAM2_TO_PC=0;
  return_connect;
  break;
  }
 }
Добавлено через 5 минут
Вот так уходит три байта но всё равно с каким то "мусором"
C++
1
2
3
4
5
6
7
8
9
char Write_Port (unsigned char *buf, size_t raz)
{
DWORD dwWritten;
for(char i=0;i<raz;i)
{
WriteFile(hCom,buf+i,1,&dwWritten,NULL);
Sleep(2);
}
}
schdub
 Аватар для schdub
2903 / 1247 / 223
Регистрация: 19.01.2009
Сообщений: 3,219
Завершенные тесты: 1
15.08.2011, 20:11     Com port (writefile кривая работа) #4
Цитата Сообщение от Korbofos Посмотреть сообщение
for(char i=0;i<raz;i)
for(char i=0;i<raz;++i)
Korbofos
3 / 3 / 0
Регистрация: 15.08.2011
Сообщений: 137
15.08.2011, 20:34  [ТС]     Com port (writefile кривая работа) #5
При увеличении паузы Sleep уходит три байта
C++
1
2
3
4
5
6
7
8
9
void Write_Port (unsigned char *buf, size_t raz)
{
DWORD dwWritten;
for(char i=0;i<raz;i++)
{
WriteFile(hCom,buf+i,1,&dwWritten,NULL);
Sleep(200);
}
}
Почему не работает эта функция?
C++
1
2
3
4
5
6
7
8
9
char Write_Port (unsigned char *buf, size_t raz)
{
DWORD dwWritten;
WriteFile(hCom,buf,raz,&dwWritten,NULL);
if(raz==dwWritten)
{return 1;}
else
{return 0;}
}
Уж про содержание отправленного я вообще молчу(((
paskal
418 / 267 / 22
Регистрация: 15.08.2011
Сообщений: 771
15.08.2011, 21:15     Com port (writefile кривая работа) #6
Цитата Сообщение от Korbofos Посмотреть сообщение
Почему не работает эта функция?
C++
1
2
3
4
5
6
7
8
9
char Write_Port (unsigned char *buf, size_t raz)
{
DWORD dwWritten;
WriteFile(hCom,buf,raz,&dwWritten,NULL);
if(raz==dwWritten)
{return 1;}
else
{return 0;}
}
Похоже что WriteFile работает асинхронно. Т.е. возврат происходит сразу, dwWritten возвращает 0, а байты скидываются во внутренний буфер и отправляются позже.
Korbofos
3 / 3 / 0
Регистрация: 15.08.2011
Сообщений: 137
15.08.2011, 21:33  [ТС]     Com port (writefile кривая работа) #7
Цитата Сообщение от paskal Посмотреть сообщение
Похоже что WriteFile работает асинхронно. Т.е. возврат происходит сразу, dwWritten возвращает 0, а байты скидываются во внутренний буфер и отправляются позже.
Тогда бы показал ошибку
C++
1
2
3
4
5
6
7
if(raz==dwWritten)
{return 1;}
else
{return 0;}
 
if(Write_Port(tx_buffer,3)==false)
{ShowMessage("error write_port");}
????

Может с буфером поиграться, но мне кажется он всяко больше байта
C++
1
2
3
4
5
BOOL SetupComm( 
HANDLE hFile, 
DWORD dwInQueue, 
DWORD dwOutQueue 
);
paskal
418 / 267 / 22
Регистрация: 15.08.2011
Сообщений: 771
15.08.2011, 21:48     Com port (writefile кривая работа) #8
Цитата Сообщение от Korbofos Посмотреть сообщение
Тогда бы показал ошибку
Так все правильно, в асинхронном режиме так и должно работать.
Просто порт надо открыть как синхронный.
Цитата Сообщение от Korbofos Посмотреть сообщение
Может с буфером поиграться, но мне кажется он всяко больше байта
C++
1
2
3
4
5
BOOL SetupComm( 
HANDLE hFile, 
DWORD dwInQueue, 
DWORD dwOutQueue 
);
dwInQueue это сколько байт в буфере приемника еще не прочитано
dwOutQueue это сколько байт в буфере передатчика еще не отправлено
можно конечно ввести цикл ожидания пока dwOutQueue не станет 0.
Korbofos
3 / 3 / 0
Регистрация: 15.08.2011
Сообщений: 137
15.08.2011, 22:28  [ТС]     Com port (writefile кривая работа) #9
Открыл как синхронный: всё тоже самое(((
Korbofos
3 / 3 / 0
Регистрация: 15.08.2011
Сообщений: 137
18.08.2011, 11:18  [ТС]     Com port (writefile кривая работа) #10
Может настройки не те выставил?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 SetupComm(hCom,6,6);
GetCommState(hCom, &dcb);
dcb.fOutxCtsFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fInX = FALSE;
dcb.fOutX = FALSE;
 
// Binary, 8N1  /
dcb.BaudRate = CBR_9600;
dcb.fBinary = TRUE;
dcb.fAbortOnError = FALSE;
dcb.fNull = FALSE;
dcb.ByteSize = 8;
dcb.fParity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(hCom, &dcb))
{
CloseHandle(hCom);
ShowMessage("Com port error");
}
 
comm_timeouts.ReadIntervalTimeout = 5000;
comm_timeouts.ReadTotalTimeoutMultiplier = 5000;
comm_timeouts.ReadTotalTimeoutConstant = 5000;
comm_timeouts.WriteTotalTimeoutMultiplier = 5000;
comm_timeouts.WriteTotalTimeoutConstant =5000;
SetCommTimeouts(hCom, &comm_timeouts);
 
PurgeComm(hCom, PURGE_RXCLEAR);
PurgeComm(hCom, PURGE_TXCLEAR);
}
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2011, 12:13     Com port (writefile кривая работа)
Еще ссылки по теме:

Writefile() & String - В контроллер приходит не то, что было отправлено C++
C++ Кривая Безье с полиномами Берштейна
C++ Пересекаются ли кривая

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Korbofos
3 / 3 / 0
Регистрация: 15.08.2011
Сообщений: 137
22.08.2011, 12:13  [ТС]     Com port (writefile кривая работа) #11
Почему функция writefile не отправляет нулевые значения?
Например:
C++
1
2
buf[2]={2,0,0}
WriteFile(hCom, buf, strlen(buf), &temp, &overlappedwr);
В порт уходит только 2?
Yandex
Объявления
22.08.2011, 12:13     Com port (writefile кривая работа)
Ответ Создать тему
Опции темы

Текущее время: 01:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru