Ср ноя 16, 2022 17:59:22
olegue писал(а):может просто не пролазит в в канал UART 115200+ GPRS?
Ср ноя 16, 2022 18:18:48
TCCR2B = _BV(CS21); // Timer2 Clock Prescaler to :
TCCR2B = _BV(CS20); // Timer2 Clock Prescaler to : 32
TCCR2A = _BV(WGM21); // Interupt frequency = 16MHz / (32 x 125 + 1) = 4000Hz
OCR2A = 125; // Compare Match register set to 125 Перешл на 4кгц
Ср ноя 16, 2022 18:30:42
Ср ноя 16, 2022 18:50:08
Ср ноя 16, 2022 19:04:38
Ср ноя 16, 2022 19:04:59
roman.com писал(а):если загрузить новые данные во внутренний буфер модуля... не дождавшись отправки предыдущего пакета... то будет плохо))
потеряем пакет... или потеряем данные... короче что то мы полюбому потеряем )) в зависимости от ситуации))
Ср ноя 16, 2022 19:59:48
olegue писал(а):скорость передающего потока может быть любой, поток накапливается в буфере на приемной стороне и оттуда воспрозиводиться с заданым сэмплрейтом. Или в жизни не так?
Ср ноя 16, 2022 20:43:17
olegue писал(а):у тебя популярный модуль sim800...
неужели никто до тебя этого не делал ? ))
olegue писал(а):может буфер UART 115200+ GPRS переполняется и не успевает передавать байты... что мало вероятно)
Чт ноя 17, 2022 00:17:29
olegue писал(а):это какая-то дичь и до меня такой фигней никто не занимался.
olegue писал(а):до этого я делал все что бы ускорить отправку, счас попробую ее замедлить. Это хороший план!
Чт ноя 17, 2022 12:44:59
if ((millis()-timerHour)>3)
{
for (int x=0; x<1024; x ++){
myGsm.write(st_pak); // st_pak - счётчик пакетов
};
// st_pak - счётчик пакетов
st_pak ++;
// st_pak - счётчик пакетов MAX = 255
if (st_pak == 255) {st_pak = 0;}
timerHour=millis();
}
Чт ноя 17, 2022 16:13:53
Чт ноя 17, 2022 16:37:01
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#include <SoftwareSerial.h>
SoftwareSerial myGsm(8,9);
unsigned long recByteCount = 0L;
unsigned long recByteSaved = 0L;
const int btnStart = 6;
const int ledStart = 2;
int recPressed = 0;
int stopPressed = 0;
byte buf00[256]; // buffer array 1
byte buf01[256]; // buffer array 2
unsigned int bufByteCount;
byte bufWrite;
unsigned long timerHour = 0;
int timerHourOn=0;
unsigned long timer1;
int timer1on = 0;
unsigned int st_pak;
void setup() {
timerHour=millis();
myGsm.begin(115200);
Serial.begin(115200);
delay(1000);
Serial.println("start... 5 sec....");delay(5000);
myGsm.println("AT+CPIN?");delay(2000);printSerialData();
myGsm.println("AT+CSQ");delay(2000);printSerialData();
myGsm.println("AT+CREG?");delay(2000);printSerialData();
// Аппаратный контроль потока должен быть включен, чтобы избежать потери данных.
//myGsm.println("AT+IFC=2,2");delay(2000);printSerialData();
//myGsm.println("AT+CIPCCFG=4,2,256,1,0,1440,20");delay(1000);printSerialData();
//myGsm.println("AT+CIPCCFG?");delay(2000);printSerialData();
myGsm.println("AT+CGATT?");delay(1000);printSerialData();
myGsm.println("AT+CIPMODE=1"); delay(2000);printSerialData();// get local IP
myGsm.println("AT+CSTT=\"internet.life.com.by\"");delay(5000);printSerialData();//setting the APN
myGsm.println("AT+CIICR"); delay(5000);printSerialData();//Bring up the wireless connection
myGsm.println("AT+CIFSR"); delay(2000);printSerialData();// get local IP
//myGsm.println("AT+CIPSTART=\"UDP\",\"XX.XX.XXX.XXX\",\"XX10\"");delay(5000);printSerialData();
//myGsm.println("AT+CIPSTART=\"UDP\",\"XXX.XXX.XXX.XXX\",\"XX10\"");delay(5000);printSerialData();
myGsm.println("AT+CIPSTART=\"UDP\",\"XX.XXX.XXX.XXX\",\"XX10\"");delay(5000);printSerialData();
// myGsm.println("AT+CIPSTART=\"UDP\",\"XXX.XXX.XXX.XXX\",\"XX10\"");delay(5000);printSerialData();
//myGsm.println("AT+CIPQSEND");delay(10); //printSerialData();
//myGsm.println("AT+CIPSEND");delay(50); //printSerialData();
Setup_timer2();
Setup_ADC();
pinMode(10, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(btnStart, INPUT_PULLUP);
Serial.flush();
delay(2000);
myGsm.flush();
delay(2000);
}
void loop() {
//printSerialData();
if (recByteCount % 512 == 256 ) //&& recPressed == 1)
{
// myGsm.write(buf00, 256);
recByteSaved += 256;
}
if (recByteCount % 512 == 0)// && recPressed == 1)
{
//myGsm.write(buf01, 256);
recByteSaved += 256;
}
if ((millis()-timerHour)>125){
timerHour=millis();
}
//if ((millis()-timerHour)>1)
//{
//
// for (int x=0; x<1024; x ++){
// myGsm.write(st_pak); // st_pak - счётчик пакетов
// };
// // st_pak - счётчик пакетов
// st_pak ++;
// // st_pak - счётчик пакетов MAX = 255
// if (st_pak == 255) {st_pak = 0;}
// timerHour=millis();
// }
} //loop
void StartRec() { // begin recording process
digitalWrite(ledStart, HIGH);
recByteCount = 0;
recByteSaved = 0;
recPressed = 1; // recording button has been pressed
stopPressed = 0;
sbi (TIMSK2, OCIE2A); // enable timer interrupt, start grabbing audio
}
void StopRec() { // stop recording process, update WAV header, close file
cbi (TIMSK2, OCIE2A); // disable timer interrupt
digitalWrite(ledStart, LOW); // turn off recording LED
recPressed = 0;
}
void Setup_timer2() {
TCCR2B = _BV(CS21); // Timer2 Clock Prescaler to : 8
//TCCR2B = _BV(CS20); // Timer2 Clock Prescaler to :32
TCCR2A = _BV(WGM21); // Interupt frequency = 16MHz / (8 x 125 + 1) = 16000Hz
//OCR2A = 125; // Compare Match register set to 125 (было 90) Перешл на 16кгц
OCR2A = 250; // Compare Match register set to 250 (было 90) Перешл на 8кгц
}
void Setup_ADC() {
ADMUX = 0x60; // set ADC to read pin A0, ADLAR to 1 (left adjust)
cbi(ADCSRA, ADPS2); // set prescaler to 8 / ADC clock = 2MHz
sbi(ADCSRA, ADPS1);
sbi(ADCSRA, ADPS0);
}
ISR(TIMER2_COMPA_vect) {
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
recByteCount++; // increment sample counter
bufByteCount++;
if (bufByteCount == 256 && bufWrite == 0) { // если 256 и буф=0
bufByteCount = 0;
bufWrite = 1;
} else if (bufByteCount == 256 & bufWrite == 1) {
bufByteCount = 0;
bufWrite = 0;
}
if (bufWrite == 0) {
buf00[bufByteCount] = ADCH;
}
if (bufWrite == 1) {
buf01[bufByteCount] = ADCH;
}
myGsm.write(ADCH); // ОТПРАВЛЯЕМ ОП 1 БАЙТУ. ТАК ХОТЬ КАК-ТО ПОЛУЧАЕМ РАЛИЧИМЫЙ ЗВУК
}
void printSerialData()
{while(myGsm.available()!=0){Serial.write(myGsm.read());}}
Чт ноя 17, 2022 17:34:34
Пт ноя 18, 2022 00:54:10
if (recByteCount % 1024 == 512 && recPressed == 1) {
rec.write(buf00, 512); // save buf01 to card
recByteSaved += 512;
}
if (recByteCount % 1024 == 0 && recPressed == 1) {
rec.write(buf01, 512); // save buf02 to card
recByteSaved += 512;
}
ISR(TIMER2_COMPA_vect) {
//ADMUX = 0x60; // set ADC to read pin A1, ADLAR to 1 (left adjust)
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
recByteCount++; // increment sample counter
//Serial.println(recByteCount);
bufByteCount++;
if (bufByteCount == 512 && bufWrite == 0) {
bufByteCount = 0;
bufWrite = 1;
} else if (bufByteCount == 512 & bufWrite == 1) {
bufByteCount = 0;
bufWrite = 0;
}
Пт ноя 18, 2022 10:47:35
Пт ноя 18, 2022 13:30:31
[b]лучше так.[/b]..
----------
ISR(TIMER2_COMPA_vect) {
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
if (bufWrite == 0) { // флаг выбор буфера 0
buf00[bufByteCount] = ADCH;
}
if (bufWrite == 1) { // флаг выбор буфера 1
buf01[bufByteCount] = ADCH;
}
bufByteCount++; // счёт буфер
if (bufByteCount == 256 && bufWrite == 0) { // если 256 и флаг выбор буфера 0
bufByteCount = 0;
bufWrite = 1; // флаг выбор буфера 1
myGsm.write(buf00, 256); // буфер 0 полный. Передача буфера 0.
}
if (bufByteCount == 256 && bufWrite == 1) { // если 256 и флаг выбор буфера 1
bufByteCount = 0;
bufWrite = 0; // флаг выбор буфера 0
myGsm.write(buf01, 256); // буфер 1 полный. Передача буфера 1.
}
}
Пт ноя 18, 2022 14:26:30
olegue писал(а):а это нормально если прямо из функции прерывания таймера отправлять данные?
Сб ноя 19, 2022 11:03:33
[int] $Port = 80
$IP = "192.168.0.124"
$Address = [system.net.IPAddress]::Parse($IP)
# Create IP Endpoint
$End = New-Object System.Net.IPEndPoint $address, $port
# Create Socket
$Saddrf = [System.Net.Sockets.AddressFamily]::InterNetwork
$Stype = [System.Net.Sockets.SocketType]::Dgram
$Ptype = [System.Net.Sockets.ProtocolType]::UDP
$Sock = New-Object System.Net.Sockets.Socket $saddrf, $stype, $ptype
$Sock.TTL = 26
# Connect to socket
$sock.Connect($end)
$file = [io.file]::ReadAllBytes('d:\18-02-06.WAV')
[PSObject[]] $byteArray = new-object PSObject[] 1024
$i=0
foreach ($element in $file) {
$byteArray[$i] = $element
if ($i -eq 1023)
{
# 1/16000*1024=0.064
# 64 мс - скорость отправки пакетов для sr=16кгц
Start-Sleep -Milliseconds 64
$Sent = $Sock.Send($byteArray)
"{0} characters sent to: {1} " -f $Sent,$IP
$i=0
}
$i++
}
# End of Script
Сб ноя 19, 2022 11:53:03
olegue писал(а):Ваш java плейер регирует на эти данные так же как и на данные отправленные с модуля sim800, т.е первые 1.5 сек - нормлаьно , потом начинает рвать поток и тут уже канал не причем.
olegue писал(а):Написал небольшой скрипт в PowerShell Для разделения wav файла на пакеты по 1кб и отправки их на udp server
Вс ноя 20, 2022 14:32:33