VB 2010: COM порт
|
|
xxxmonejall |
Дата: Вт, 03.01.2012, 01:39 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Доброго времени суток. В программирование полный ноль:) Так что сильно не пинайте. задача состоит в том что нужно принимать данные с ком порта, и рисовать по них график. Все вроде бы работает, с микроконтроллера данные посылаются, моя программа их принимает.Но замечен глюк от 0 до 99 график рисуется, но только переходит за 100 начинаются глюки. Прилагаю фото графика и сам исходник. Может кто что подскажет, извините если что не так Но это первая моя программа на ПК. Раньше никогда не писал. Да и еще с контролера данные идут такие как нужно смотрел через терминал.
include "MODEDEFS.BAS" @ device pic16F84A, xt_osc, wdt_off, protect_off, pwrt_on Define CHAR_PACING 500 DEFINE OSC 4 Trisb = %00000000 diodes var word diodes = 0 main: diodes = diodes + 1
serout portb.1, T9600, [#diodes,13] pause 50 portb.3 = 1 pause 50 portb.3 = 0 pause 50 goto main
______________________________________________________________________________________________________________ Public Class TEST
Dim data_from_port As String = 0 Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Control.CheckForIllegalCrossThreadCalls = False
End Sub
Public Sub Chart1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Chart1.Click
End Sub
Public Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
End Sub
Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click SerialPort1.PortName = ComboBox1.Text SerialPort1.BaudRate = ComboBox2.Text SerialPort1.WriteTimeout = 500 SerialPort1.ReadTimeout = 500 SerialPort1.StopBits = ComboBox3.Text SerialPort1.DataBits = ComboBox4.Text SerialPort1.Open()
If SerialPort1.IsOpen = True Then Button2.Visible = True End If If SerialPort1.IsOpen = True Then Button1.Visible = False End If End Sub
Public Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If SerialPort1.IsOpen = True Then SerialPort1.Close() End If If SerialPort1.IsOpen = False Then Button2.Visible = False End If If SerialPort1.IsOpen = False Then Button1.Visible = True End If
End Sub
Public Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
End Sub
Public Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
End Sub
Public Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
data_from_port = SerialPort1.ReadExisting() TextBox1.Text = data_from_port Chart1.Series("Форсунка 1").Points.AddY(data_from_port)
End Sub
Private Sub ComboBox4_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox4.SelectedIndexChanged
End Sub
Private Sub ComboBox3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox3.SelectedIndexChanged
End Sub
Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
End Sub
Private Sub Label4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label4.Click
End Sub End Class
|
|
|
|
ADMIN |
Дата: Вт, 03.01.2012, 18:50 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Надо при отладке смотреть что попадает в data_from_port. Скорей всего дело в строке: Chart1.Series("Форсунка 1").Points.AddY(data_from_port) Разве точка добавляется как String?
|
|
|
|
xxxmonejall |
Дата: Чт, 05.01.2012, 11:07 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Я это уже пробовал менять:( Ничего не вышло. Гипер терминалом с контролера все гуд. А тут на тебе:( Может с настройкой порта что-то, слышал что есть такая штука как проверка четности и бытности ну или что-то типа того. Но как с с этим работать не знаю.
|
|
|
|
ADMIN |
Дата: Чт, 05.01.2012, 17:51 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Что пробовал менять? И что не вышло? Если гипертерминалом все ОК, то причем тут четность? Я говорю, что нужно запустить приложение пошагово и передавать в COM данные. И пошагово смотреть, что попадает в Chart после 99.
|
|
|
|
xxxmonejall |
Дата: Пт, 06.01.2012, 23:21 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Все:) Наконец то понял в чем проблема: поменял DEFINE char_pacing 1000 на 100 (задержка между передачей знаков на МК) А в программе на ПК SerialPort1.ReadTimeout = 10000 И все как-бы заработало, но замечены все же не приятные глюки. Збои начались после числа 400. Радует только то что ясна причина:) Есть еще один вопросик: можно ли сделать так чтобы мк отправил что-то и ждал пока с ПК не придет команда что данные получены, и аж тогда отправлял следующие данные дальше, и чтоб та же история была на пк?
|
|
|
|
ADMIN |
Дата: Сб, 07.01.2012, 05:23 | Сообщение # 6 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Я вот не понимаю - 'вроде бы заработало, но как-бы глючит'. Насчет второго вопроса - у команды serout есть модификатор 'wait'
|
|
|
|
xxxmonejall |
Дата: Сб, 07.01.2012, 18:38 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Quote Насчет второго вопроса - у команды serout есть модификатор 'wait' Синтаксис команды serout: serout Pin, mode, [Item {, Item...}] По книге хилинского. Так где там есть wait??? Вот в serout2 есть такая штука как FlowPin, вот это как раз то что мне нужно. Или я просто что-то не так понял?
|
|
|
|
ADMIN |
Дата: Сб, 07.01.2012, 19:55 | Сообщение # 8 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Извиняюсь, оговорился. Конечно, не у команды SEROUT, а у команды SERIN2. То есть, команда serin2, в которой можно указать модификатор Wait, будет ожидать указанную в модификаторе последовательность в течение определенного времени и перейдет на метку, в зависимости от результата. Насчет FlowPin не разбирался, не знаю.
|
|
|
|
ADMIN |
Дата: Сб, 07.01.2012, 20:18 | Сообщение # 9 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Кстати здесь есть пример с использованием этого модификатора, правда на протоне и с командой HSERIN. Думаю, смысл будет понятен
|
|
|
|
xxxmonejall |
Дата: Чт, 23.02.2012, 00:27 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Доброго времени суток. Есть вопрос: С устройства на микроконтроллере по УСАРТ приходит куча разной информации в таком виде: F1 = 21321, F2 = 3434, F3 = 654645, F4 = 23423, RPM = 3434 и еще кучу всего. ловлю все это на пк и вывожу в TextBох, и там это все это вижу так-же все это можно записать в переменную и что угодно с этим делать. Как на Basice можно это все отфильтровать, как значение после F1 = записать в переменную F1, а значение после F2 = в переменную F2 и тд... Может кто что посоветует???
|
|
|
|
DAlexV |
Дата: Чт, 23.02.2012, 11:59 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
В VB6 есть функция SPLIT. В VB2010 наверное то же есть. Гонишь данные через в числовом виде через запятую например. Апосля чего запускаешь функцию SPLIT и получаешь массив с разделенными данными. Работает быстрее чем MID$ http://www.picbasic.ru/forum/9-141-1529-16-1234283755 (спасибо ALEXу, за подсказку)
a() = Split(C_Port.Data_Resive, ",")
Res_Data.Dat_A = Val(Trim(a(0))) / 10 Res_Data.Dat_B = Val(Trim(a(1))) / 10 Res_Data.Dat_C = Val(Trim(a(2))) / 10 Res_Data.PID = Val(Trim(a(3)))
пример для изучения http://www.picbasic.ru/forum/9-141-2291-16-1243695810 (VER4.rar)
Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
xxxmonejall |
Дата: Сб, 25.02.2012, 03:05 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
139
Замечания:
±
На сайте с 17.05.2008
Статус:
Offline
|
Большое спасибо.... буду разбираться:)
|
|
|
|
MiXaS |
Дата: Чт, 15.05.2014, 22:45 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Здрасте господа! Решил не создавать новую тему, так как вопрос с темой схож. Начал осваивать компанент MSComm в Visual Basic 6.0. Порт настроил, открыл, все работает отлично, но данные передает в ASCII коде, ну или строковую переменную шлет. Вопрос, как заставить MScomm1.Output слать к примеру в hex или dec. MScomm.Output ест только string. Спасибо
|
|
|
|
DAlexV |
Дата: Пт, 16.05.2014, 00:47 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Цитата MiXaS ( ) Вопрос, как заставить MScomm1.Output слать к примеру в hex или dec. Да все просто. Склеить все данные для передачи в одну строку и отдать ее на растерзание буферу передатчика MScomm.
Dim STRout as string
STRout="" ' не забывать чистить переменную перед занесением в нее новых данных STRout=chr$(13)+chr$(10)+chr$(255)+chr$(13) ' где chr$("то что в скобках и есть данные")
MSComm1.Output =STRout
ссылка в помощь: http://support.microsoft.com/kb/158008/ru
Успехов
|
|
|
|
MiXaS |
Дата: Вт, 10.06.2014, 13:38 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
DAlexV, спасибо! Сейчас попробую! Добавлено (16.05.2014, 13:35) --------------------------------------------- Действительно работает! Спасибо! Добавлено (09.06.2014, 18:21) --------------------------------------------- В продолжение темы. Перешел на VB2010. Пытаюсь связать 18f2550 с VB2010 по 232(про юсби знаю, но задача другая). Все вяжется, передается и принимается, только есть одно НО. Я решил не заморачиваться и использовал готовый протокол связи MoDBus RTU. Так вот, при запросе с компа на чтение параметров, в контроллер прилетает все четко, например запрос: 01 03 00 00 00 08 44 0С, контроллер распознает запрос, проверяет CRC и формирует ответ. Ответ приходит правильный за исключением последнего байта CRC. Последние 2 байта в 12 байтной посылке иногда приходят правильные, но это примерно через 5 раз. Когда приходит не правильные данные возвращается код 3f, что соответсвует вопросительному знаку ascii. Также я понял что это связанно со свойством ParityReplace = 63 это свойство прописано по умолчанию. Дело в том, что до не давнего времени все работало, а потом в одночасье перестало и не могу найти причину, уже другой проект создал, но диагноз тот же. С помощью COmPump проверяю, все четко приходит, 100% данных приходят, делал куча запросов. А вот VB2010 сопротивляется и все. Есть подозрение, что идет рассинхронизация, что ли, (я знаю что интерфейс асинхронный).
SerialPort1.PortName = "COM3" SerialPort1.BaudRate = 9600 SerialPort1.DataBits = 8 SerialPort1.StopBits = IO.Ports.StopBits.One SerialPort1.Parity = IO.Ports.Parity.None SerialPort1.WriteTimeout = 500 SerialPort1.ReadTimeout = 500 SerialPort1.Handshake = IO.Ports.Handshake.None Добавлено (09.06.2014, 19:25) --------------------------------------------- Так, частично разобрался. Подключил компамп через 232 к своей проге на vb2010, все работает. Начал мучать контроллер. Короче написал жесткий ответ без всяких расчетов, и все работает без ошибок. Остается вопрос что происходит с контроллером. Как-то я уже поднимал вопрос на эту тему. Короче в 2 словах:
ЕUsart настроен на прерывание,
В прерывании заполняется буфер притятых данных с порта. Здесь вопросов нет, все работает отлино.
Когда основной код не большой, скажем просто вывести на LCD 2 строки(смотрю что прилетело в порт), то тут происходит самое интересное. То данные не все прилетают, то часть теряется, то не могу отправить в порт обратно (Hserout или TXREG = ни то ни то не работает), пока не поставлю задержку в 15-100 мс сек в основном коде. Но это мне не подходит. Declare FSR_CONTEXT_SAVE = On объявил, Context Save и Context restory тоже есть, но не работает. Хоть вешайся. Год назад долбался и не допер и сейчас таже история. Может у кого было подобное, что с этим делать? Добавлено (10.06.2014, 13:38) --------------------------------------------- Вот еще инфа. Контроллер бедный уже по всякому перешил. И решил соединить компамп с прогой. Дальше кидаю в порт и смотрю что пришло. Оказалось, что до значения 128($80) все работает как часы, а вот выше 128 и выше приходят вопросы, что делать???? Тут явно visual basic троит, дальше то русские символы должны быть, если учесть ascii. Товарищи знатоки, подскажите в чем соль?!
|
|
|
|