Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/64: Рейтинг темы: голосов - 64, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28

Отправка массива в serialPort

02.03.2016, 00:15. Показов 13221. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста. Программа создаёт
C#
1
int mas01[]={82,164,73,146,37,74,148,41}
и мне это массив надо отправить в serialPort, я пишу:
C#
1
2
3
4
5
6
7
8
char[] buffer01 = new char[8];
char[] kon01=new char[8];
for (int i = 0; i < 8; i++)
{
char str = (char)kon01[i];
buffer01[i] = kon01[i];
}
serialPort1.Write(buffer01, 0, 4);
Скажите, это правильно или нет? А то я не могу понять где у меня проблема, до порта или уже после
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.03.2016, 00:15
Ответы с готовыми решениями:

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

Serialport.write и serialport.basestream.write - в чем разница
в чем разница между следующими способами отправки данных на ком-порт?: serPort.BaseStream.Write(data,0,datalen); ...

Serialport
Всем привет) подскажите пожалуйста, может кто встречался с такой проблемой. Иногда при получении ответа с ком порта не все данные сразу...

37
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
06.03.2016, 01:39  [ТС]
Студворк — интернет-сервис помощи студентам
Всё равно ничего не понимаю
Вот такой код:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
 
namespace Temp
{
    public partial class Form1 : Form
    {        
        public Form1()
        {
            InitializeComponent();
            serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;            
            serialPort1.Open();
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            int[] mas03 = { 82, 164, 73, 146, 37, 74, 148, 41 };
            byte[] outmas = mas03.Select(p => (byte)p).ToArray();
            for (int i = 0; i < outmas.Length; i++)
            {
                textBox1.Text += "\n " + outmas[i].ToString();
            }
            serialPort1.Write(outmas, 0, outmas.Length);
 
            
            
        }  
 
        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
        }
    }
}
после нажатия кнопки в текстбоксе всё правильно, а в мониторе порта (Serial Port Monitor) я вижу
52 a4 49 92 25 4a 94 29 R¤I’%J”)
вместо
20 20 38 32 31 36 34 37 33 31 34 36 33 37 37 34 31 34 38 34 31 8216473146377414841
почему так? И как сделать что бы там было то что мне нужно?
0
Эксперт .NET
 Аватар для Rius
13683 / 7863 / 1702
Регистрация: 25.05.2015
Сообщений: 23,877
Записей в блоге: 14
06.03.2016, 07:41
Цитата Сообщение от Woland50 Посмотреть сообщение
И как сделать что бы там было то что мне нужно?
Вам надо понять разницу между текстовым представлением, строками, символами и байтами. И ещё строками в виде массива байт в указанной кодировке.
А также усвоить внутреннее представление чисел и прочих (хотя бы простых) данных в памяти ЭВМ. Это необходимость.
1
36 / 25 / 12
Регистрация: 08.04.2013
Сообщений: 269
06.03.2016, 10:59
Что за устройство, на которое отправляется массив?
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
06.03.2016, 11:18  [ТС]
Это всё я уже понял, перечитал вот тут всё http://pashkevich.me/article/1.html. Я не знаю как написать что бы было правильно, вы мне можете подсказать правильный код?

Добавлено через 41 секунду
Arduino uno
0
36 / 25 / 12
Регистрация: 08.04.2013
Сообщений: 269
06.03.2016, 12:33
DEC | HEX
82 | 52
164 | A4

и т.д. В порт все уходит правильно.
Что такое "20 20 38 32 31 36 34 37 33 31 34 36 33 37 37 34 31 34 38 34 31"?

Добавлено через 11 минут
Все, понял. Массив байт 0x20, 0x20, 0x38, 0x32, 0x31, 0x36, 0x34, 0x37, 0x33, 0x31, 0x34, 0x36, 0x33, 0x37, 0x37, 0x34, 0x31, 0x34, 0x38, 0x34, 0x31 равен строке 8216473146377414841.

Теперь осталось узнать, что именно нам надо отправить в порт
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
06.03.2016, 12:58  [ТС]
lemeserg, мне надо оправлять на ардуино вот такие массивы int[] mas03 = { 82, 164, 73, 146, 37, 74, 148, 41 }. Программа высчитывает эти цифры и после отправки на ардуино, там должны загораться нужные светодиоды. Как на рекламных светодиодных досках с бегущей строкой. Каждая цифра это значение восьми светодиодов каждый отрезок времени.
0
36 / 25 / 12
Регистрация: 08.04.2013
Сообщений: 269
06.03.2016, 12:59
Хорошо, что означает для этих светодиодов цифра 82?
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
06.03.2016, 13:15  [ТС]
82 = 01001010 = горит второй, пятый и седьмой светодиод.
164 - тоже самое только сдвинуто на один символ вправо тоесть 00100101, горит третий, шестой и восьмой
0
36 / 25 / 12
Регистрация: 08.04.2013
Сообщений: 269
06.03.2016, 13:19
Вооот. Значит отсюда следует, что мы должны сначала отправить в порт 82, выставить тайм-аут, потом погасить светодиоды и по циклу отправляем следующий байт. А так мы плюхнули пачку и устройство не понимает команду.
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
06.03.2016, 13:26  [ТС]
И как это сделать?
0
36 / 25 / 12
Регистрация: 08.04.2013
Сообщений: 269
06.03.2016, 14:13
Лучший ответ Сообщение было отмечено Woland50 как решение

Решение

У том же цикле где запись в текстбокс отправлять outmas, i, 1. Пишу с телефона, неудобно кодом показать

Добавлено через 43 минуты
Мигают?
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
06.03.2016, 14:59  [ТС]
В общем получился у меня вот такой результат:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int[] mas = new int[16];
            for (int i = 0; i < 8; i++)
            {
                mas[i] = mas01[i];
                mas[i + 8] = mas02[i];                
            }
            for (int i = 0; i < 16; i++)
            {
                textBox9.Text += "\n " + mas[i].ToString();
            }
            
            byte[] outmas = mas.Select(p => (byte)p).ToArray();
            for (int i = 0; i < outmas.Length; i++)
            {               
                serialPort1.Write(outmas, i, 1);
            }
Мигают наконец-то не хаотично Но ещё не идеал, получается с таким кодом отправляется одно значения за раз, а если надо первое и девятое? Или не так ...
Сейчас соображу.
У меня к ардуино подключено два сдвиговых регистра в каскаде. Тоесть что бы они сработали оба надо отправить 16 бит, первые 8 бит пройдут на второй и вторые 8 бит на первый.
Чтобы зажёгся первый и третий светодиод во втором ряду и второй в первом ряду, надо оправить сначала 5 потом 2. 5 это первый элемент массива, а 2 это девятый. Я правильно мыслю?

Добавлено через 7 минут
C#
1
2
3
4
5
6
            
for (int i = 0; i < outmas.Length; i++)
{               
serialPort1.Write(outmas, i, 1);
serialPort1.Write(outmas, i+8, 1);
}
А не получается так: Смещение и длина вышли за границы массива или значение счетчика превышает количество элементов от указателя до конца исходной коллекции.

Добавлено через 19 минут
Всё, сделал

Код C#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int[] mas = new int[16];
for (int i = 0; i < 8; i++)
{
mas[i] = mas01[i];
mas[i + 8] = mas02[i];                
}
for (int i = 0; i < 16; i++)
{
textBox9.Text += "\n " + mas[i].ToString();
}
byte[] outmas = mas.Select(p => (byte)p).ToArray();
for (int i = 0; i < outmas.Length; i++)
{               
serialPort1.Write(outmas, i, 1);                
}
и код Arduino
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
byte x[65];
byte x01[32];
byte x02[32];
void loop()
{
   if (Serial.available() > 0)
   {      
      Serial.readBytes(x,64);
   } 
  for(int i=0; i<8; i++)
  {
    x01[i]=x[i];
    x02[i]=x[i+8];
  digitalWrite(latchPin, LOW); 
  shiftOut(dataPin, clockPin, MSBFIRST, x02[i]); //нижний ряд
  shiftOut(dataPin, clockPin, MSBFIRST, x01[i]); //верхний ряд
  delay(200);
  digitalWrite(latchPin, HIGH);
  }
Спасибо всем кто помогал!
0
36 / 25 / 12
Регистрация: 08.04.2013
Сообщений: 269
06.03.2016, 15:41
А если надо будет первый и седьмой, то надо будет код переписывать? )))
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
06.03.2016, 16:10  [ТС]
Два ряда светодиодов
Первый ряд: 01,02,03,04,05,06,07,08;
Второй ряд: 09,10,11,12,13,14,15,16.
Первый и девятый это первые в каждом ряду.
вот видео.
0
36 / 25 / 12
Регистрация: 08.04.2013
Сообщений: 269
06.03.2016, 16:15
И второй момент, паузу я бы делал в c#, а не в коде ардуино

Добавлено через 4 минуты
Глянул видео. Когда нажимаешь очистить, то сначала нули в порт, потом закрывай. Надо себе ардуино прикупить. Всю сознательную жизнь хотелось светодиодами помигать)))
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
06.03.2016, 16:22  [ТС]
А куда её там впихнуть эту паузу? Она задаёт перерыв между мигами, для того что бы не загорались сразу все(для глаза). А дуню советую приобрести, я уже две недели не могу наиграться
0
36 / 25 / 12
Регистрация: 08.04.2013
Сообщений: 269
06.03.2016, 16:29
После отправки в порт делаем thread.sleep(200); А то получается если увеличить задержку в ардуино скажем в секунду, то работать уже вряд ли будет

Добавлено через 3 минуты
И цикл в ардуино поместить в условие
0
06.03.2016, 17:45

Не по теме:

Цитата Сообщение от Woland50 Посмотреть сообщение
А дуню советую приобрести, я уже две недели не могу наиграться
Вы, главное, на Ардуине не останавливайтесь.
Ибо это жуткий тормоз и костыль по сравнению с работой с микроконтроллерами напрямую.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2016, 17:45

SerialPort
Добрый день! Никак не выходит реализовать протокол 1Wire. Вроде бы на шину удается кинуть данные, а вот корректно прочитать - нет. ...

SerialPort
Добрый день форумчане! Подскажите пожалуйста, используя библиотеку qserialport и команду readline, как мне кажется я считавыю строку...

SerialPort в C++
Привет всем! Я начинаю изучать C++, помогите разобраться. Нужно по сериал порту передать строку. как это сделать? Пишу на c++ win32 console...

SerialPort
Здравствуйте. Использую компонент SerialPort для чтения символов с ком-порта. Примерный код: private void...

Serialport
Есть программа но на этапе компиляции выдает ошибку. для компиляции использую ActiveState Perl Dev Kit 9.1.1 #!/usr/bin/perl #...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru